麻烦搞清楚routes.Maproute此URL(C#) [英] Trouble Figuring Out The routes.Maproute For This URL (C#)
问题描述
尽管URL路由的帖子多如牛毛,我还没有就这一问题达成启示。
我有一个MVC应用程序工作正常,但我想获得幻想,并做一些URL重写,使其更容易在我的用户。
缺省路由是平时的一个微小的变化:
routes.MapRoute(
默认,
{控制器} / {行动} / {查询},
新{控制器=SomeController,行动=索引,查询=});
我想要做的是重新路由的网址 http://mysite.com/12345 到SomeController的详细行动12345查询。我想这样的:
routes.MapRoute(
DirectToDetails
{查询},
新{控制器=SomeController,行动=详细信息查询=});routes.MapRoute(
默认,
{控制器} / {行动} / {查询},
新{控制器=SomeController,行动=索引,查询=});
但最终掩盖 http://mysite.com/ 以及它去SomeController /细节,而不是SomeController的/索引。
编辑:
@乔恩每次的意见,我删除了查询=的匿名对象:
routes.MapRoute(
DirectToDetails
{查询},
新{控制器=SomeController,行动=详细信息});
...其中涉及的问题尽可能去;现在,当我在查看/ SomeView /索引提交表单(即提交上述SomeController /详细信息)我得到一个资源无法找到的错误。
下面的形式声明:
<%使用(Html.BeginForm(
细节,
SomeController
FormMethod.Post,
新{ID =SearchForm})){%GT;
<%Html.RenderPartial(SearchForm模型); %GT;
<%= Html.ValidationMessageFor(型号=> model.Query)%GT;
<%}%GT;
删除查询=
(显然这不是可选正是因为这个问题你遇到 - 没必要把它的第三个参数,如果没有合理的缺省值),并使用图路线
的重载需要4个参数与路由约束:
routes.MapRoute(
DirectToDetails
{查询},
新{控制器=SomeController,行动=详细信息},
新{查询= @\\ D +});
显然,你将需要调整正则表达式,如果它不是一个整数...
在回答您的编辑...确保你已经删除从短路线查询默认的 - 你已经发布的默认一个人也没有。也建议你仔细检查的形式,并确保它张贴值查询
(也许设置岗位操作方法一个破发点,并确保查询参数被正确绑定?)。
Despite the plethora of URL routing posts, I have yet to reach enlightenment on the subject.
I have an MVC app that works fine, but I want to get fancy and do some URL rewriting to make it easier on my users.
The default route is a slight variation on the usual:
routes.MapRoute(
"Default",
"{controller}/{action}/{query}",
new{ controller = "SomeController", action="Index", query = "" });
What I want to do is re-route the URL http://mysite.com/12345 to the Details action of SomeController with the 12345 query. I tried this:
routes.MapRoute(
"DirectToDetails",
"{query}",
new{ controller = "SomeController", action="Details" query="" });
routes.MapRoute(
"Default",
"{controller}/{action}/{query}",
new{ controller = "SomeController", action="Index", query = "" });
but that ends up obscuring http://mysite.com/ and it goes to SomeController/Details instead of SomeController/Index.
EDIT:
per the advice of @Jon I removed the query = "" in the anonymous object:
routes.MapRoute(
"DirectToDetails",
"{query}",
new{ controller = "SomeController", action="Details" });
... which addressed the question as far as it went; now when I submit the form at Views/SomeView/Index (that submits to the aforementioned SomeController/Details) I get a "resource cannot be found" error.
Here is the form declaration:
<% using (Html.BeginForm(
"Details",
"SomeController",
FormMethod.Post,
new { id = "SearchForm" })) { %>
<% Html.RenderPartial("SearchForm", Model); %>
<%= Html.ValidationMessageFor(model => model.Query) %>
<% } %>
Remove the query = ""
(obviously it's not optional exactly because of the problem you're having - no need to put it in the 3rd argument if there's no sensible default) and use the overload of MapRoute
that takes a 4th parameter with route constraints:
routes.MapRoute(
"DirectToDetails",
"{query}",
new { controller = "SomeController", action="Details" },
new { query = @"\d+" });
Obviously you will need to adjust the regex if it's not an integer...
In response to your edit...make sure that you've removed the default for query from the "short" route - you've posted the default one there. Also suggest you double check the form and make sure it's posting a value for query
(maybe set a break point on the post action method and make sure the query parameter is being bound correctly?).
这篇关于麻烦搞清楚routes.Maproute此URL(C#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!