尽管有大量的URL路由帖,但我尚未就此主题达成启示。
我有一个可以正常使用的MVC应用程序,但我希望得到一些想法并进行一些URL重写以使我的用户更容易。
默认路线与通常情况略有不同:
routes.MapRoute(
"Default",
"{controller}/{action}/{query}",
new{ controller = "SomeController", action="Index", query = "" });
我想要做的是使用12345查询将URL http://mysite.com/12345重新路由到SomeController的Details操作。我试过这个:
routes.MapRoute(
"DirectToDetails",
"{query}",
new{ controller = "SomeController", action="Details" query="" });
routes.MapRoute(
"Default",
"{controller}/{action}/{query}",
new{ controller = "SomeController", action="Index", query = "" });
但最终会模糊http://mysite.com/,它会转到SomeController / Details而不是SomeController / Index。
编辑:
根据@Jon的建议我删除了匿名对象中的query =“”:
routes.MapRoute(
"DirectToDetails",
"{query}",
new{ controller = "SomeController", action="Details" });
......就这个问题提出了问题;现在,当我在Views / SomeView / Index(提交上述SomeController / Details)提交表单时,我收到“无法找到资源”错误。
以下是表单声明:
<% using (Html.BeginForm(
"Details",
"SomeController",
FormMethod.Post,
new { id = "SearchForm" })) { %>
<% Html.RenderPartial("SearchForm", Model); %>
<%= Html.ValidationMessageFor(model => model.Query) %>
<% } %>
答案 0 :(得分:0)
删除query = ""
(显然它不是可选的,因为你遇到的问题 - 如果没有合理的默认值,则不需要将它放在第3个参数中)并使用MapRoute
的重载采用路径约束的第四个参数:
routes.MapRoute(
"DirectToDetails",
"{query}",
new { controller = "SomeController", action="Details" },
new { query = @"\d+" });
显然你需要调整正则表达式,如果它不是整数...
响应您的编辑...确保您已从“短”路线中删除了查询的默认值 - 您已在此处发布了默认值。还建议您仔细检查表单并确保它发布query
的值(可能在post action方法上设置一个断点并确保查询参数绑定正确?)。