任何人都可以帮助我吗?我在ASP.NET MVC中做了一些测试。
我想将优秀的URL实现为stackoverflow.com路由系统。
例如: stackoverflow.com/questions/1074/asp-mvc domain.com/id/title
这是我的代码:
routes.MapRoute(NULL, “的帖子/ {}帖子ID / {标题}”, new {controller =“Posts”,action =“Details”,post =(string)null}, new {PostId = @“\ d +”,Title = @“([A-Za-z0-9 - ] +)”} );
:
使用这些代码,我正在设置网址:http://localhost:53171/posts/Details?PostID=5&Title=Test-title
一个人可以告诉我吗?
非常感谢你。
答案 0 :(得分:3)
不确定所有stackoverflow网址的含义,但是如果你想要一个干净的网址:
https://stackoverflow.com/Questions/132/thetitle
在你的Global.asax中:
routes.MapRoute("PostController",
"Questions/{post_id}/{post_title}",
new { controller = "Post", action = "Index" },
new { post_id = @"\d+", post_title = @"([A-Za-z0-9-]+)" }
);
在您的控制器中检索值:
public ActionResult Index(Int32 post_Id, String post_title)
{
return View();
}
要生成正确的网址,请使用Html.RouteLink:
<%= Html.RouteLink("The Title", "PostController", new { post_id = 132, post_title = "thetitle" })%>
答案 1 :(得分:1)
我认为您需要在帖子标题的路线中添加一些默认值...并确保它们映射。您似乎没有'postId'和'title'的默认值,但是您有一个不存在的'post'路线值。
routes.MapRoute(
"PostDetails",
"posts/{postId}/{title}",
new { controller = "Posts", action = "Details", postId = 0, title = "" },
new { PostId = @"\d+", Title = @"([A-Za-z0-9-]+)" }
);
帖子控制器
public ActionResult Details(int postId, string title)
{
//whatever
}
然后在你看来
<%= Html.ActionLink(Model.Title, "Details", new { @postId = Model.PostID, @title = Model.Title }) %>
或者
<%= Html.ActionLink(Model.Title, "Details", "Posts", new { @postId = Model.PostID, @title = Model.Title }, null) %>
我还建议在帖子模型上创建一个TitleSlug属性。
E.g。 (代码取自here)
public partial class Post
{
public string TitleSlug
{
get
{
string str = Title.ToLower();
str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); // invalid chars
str = Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space
str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim(); // cut and trim it
str = Regex.Replace(str, @"\s", "-"); // hyphens
return str;
}
}
}
HTHS
查尔斯
答案 2 :(得分:0)
您位于正确的路径上,但您只需要将Controller ActionMethod参数的名称与Html.ActionLink中的对象路由值相匹配。
public ActionResult Index(int PostId, string Title)
{
...
return View();
}
<%= Html.ActionLink(Model.Title, "Details",
new { PostId = Model.PostID, Title = Model.Title}) %>