ASP.NET MVC - 在URL中隐藏id?

时间:2010-06-01 18:44:29

标签: asp.net-mvc asp.net-mvc-2

我正在构建一个基本的博客应用程序,用于查看数据我只是使用默认路由,即 -

routes.MapRoute
(
     "Default", // Route name
     "{controller}/{action}/{id}",
     new { controller = "Blog", action = "Index", id = UrlParameter.Optional } 
);

因此,当您访问mysite.com/View/12时,它会显示ID为12的博客。我想修改URL,使其看起来如下:mysite.com/View/2010/06/01/this -is-的标题。

我可以使用像

这样的网址映射
        routes.MapRoute(
            "View",
            "View/{year}/{month}/{day}/{title}",
            new { controller = "Blog", action = "View" }
        );

但是我没有将ID传递给Controller动作,因此我必须搜索感觉不正确的日期和标题。另一方面,如果我传入ID,它将显示在URL中,这不是我的目标。是否有任何方法在仅作为参数传递ID后将控件操作中的URL重定向到我想要的URL,或者将ID传递到映射路由但是将其隐藏在URL中?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

当您在博客帖子中创建“标题”字段时,请预先生成网址安全标题并将其放在博客表格中的colunm中。然后你可以选择,并将日期与输入匹配,以确保(对于重复)。

虽然,大多数博客都像

/2010/05/31/23343-the-topic-has-the-id-in-it

答案 1 :(得分:1)

您的网址映射理念实际上是正确的做法。您可以忽略年/月/日(但请确保您输入URL约束以仅匹配正确大小的数字)。因此,如果标题保证是唯一的(通过模型约束),则控制器操作方法可能只关心标题。只需确保您的数据库索引标题字段以便快速搜索。

正如Aren所说,还有一个常见的方法就是拥有一个'slug'字段,该字段可以获得帖子标题并使其保持URL安全并将其保存在该状态。

如果你真的想,你也可以使用通配符映射(例如“blog / {slug *}”),这些映射将映射URL中的所有其他内容,而不是使用斜杠作为分隔符,所以blog / 2010 / 02/05 / my-title将作为字符串参数传递给actionmethod,等于“2010/02/05 / my-title”

答案 2 :(得分:0)

虽然我在网址中显示了ID,但我做了类似的事情。您可以检查从默认URL路由的操作中的ID,然后将其重定向到闪亮的URL。

public ActionResult Index(int id)
{
    BlogPost blogPost=blogRepository.GetPost(id);
    TempData["post"]=blogPost;
    //this makes sure post is stored in memory so it doesn't get to database again
    return Redirect("/View/"+blogPost.year+"/"+blogPost.month+"/"+blogPost.day+"/"+blogPost.title);
}

public ActionResult View(int year, int month, int day, string title)
{
    if(TempData["post]"==null)//I assume you will publish links with that URL, so someone can be routed here without redirecting
    {

        BlogPost blogPost=blogRepository.GetPost(title);
        return View(blogPost);
    }
    else 
        return View(TempData["post"]);
}

我认为你最好发布带日期的链接,这会让你检查日期和标题以检索数据,但它看起来会更好。无论如何,如果您只想使用ID,Redirect和TempData可以做到这一点。

答案 3 :(得分:0)

传入ID时,我设置了一个会话变量,然后将用户重定向到另一个读取会话变量的控制器ActionResult。这是一个烦人的黑客,但在URL中显示ID也很烦人。您在下面看到的SessionVariables类只是一类获取/设置为会话变量的静态属性。

结束结果 - 使用会话变量重定向到没有ID的视图。

public ActionResult ViewContext(Int64 ContextID)
    {

        SessionVariables.the_context = "UserView";
        SessionVariables.the_context_id = ContextID;

        return RedirectToAction("ViewWithNoID");
    }

    public ActionResult ViewWithNoID()
    {
        //Change this to UserView

        Security_User obj = Security_User.getByPK(SessionVariables.the_context_id);

        return View("View", obj);
    }