2010-06-01 81 views
3

我建立一个基本的博客应用程序刚才,因为我只是用默认路由查看数据,即 -ASP.NET MVC - 在URL中隐藏ID?

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-the-title。

我能有一个URL映射像 -

 routes.MapRoute(
      "View", 
      "View/{year}/{month}/{day}/{title}", 
      new { controller = "Blog", action = "View" } 
     ); 

但后来我没有通过ID到控制器动作,所以我不得不在这感觉不对的日期和标题进行搜索。另一方面,如果我传递了ID,它将显示在URL中,而这不是我想要的。有没有办法在控制器动作中只传入ID作为参数后重定向到我想要的URL,或者将ID传递到Map Route但将其隐藏在URL中?

感谢您的帮助!

回答

2

当您在博客文章中创建标题字段时,请预先生成网址安全标题并将其放置在博客表中的柱状图中。然后,您可以选择该选项,并将日期与输入相匹配以确保(对于重复项)。

虽然,大多数博客虽然像

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

+0

这可能是最安全的。(日期没有必要,但也许你有这样的组织的原因。) – 2010-06-02 03:50:33

+0

有些人喜欢描述性的网址。 – Aren 2010-06-02 15:41:25

+0

谢谢,我将与此同去!我会考虑将id放入标题中,但如果我要这样做,那么我可能只需将id作为参数传递即可。 – mcfroob 2010-06-02 17:03:19

1

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

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

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

0

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

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可以做到这一点。

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); 
    }