我正在构建一个基本的博客应用程序,用于查看数据我只是使用默认路由,即 -
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中?
感谢您的帮助!
答案 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);
}