【发布时间】:2011-02-28 18:29:39
【问题描述】:
我需要的路由很简单,我一定是遗漏了一些东西。作为代码示例,我提出了可以重现我的行为的更简单的情况。
你有这个 ActionMethod :
public ActionResult Index(string provider)
{
ViewData["Message"] = provider;
return View("Index");
}
你有这条路线:
routes.MapRoute(
null,
"{controller}/{action}/{provider}",
new { controller = "Home", action = "Index", provider = "Default" }
); // Parameter defaults
您可以调用 /Home/Index/Custom,provider 将采用值“Custom”
如果我希望 url /?provider=Custom 将提供程序映射到参数,我需要什么路由。 我认为这会起作用,因为将使用默认控制器和默认操作,并且将使用查询字符串中的提供者而不是默认提供者。 但是这里只是忽略了查询字符串。
在我的情况下这是一个问题,因为我有一个使用 HTTP GET 方法的表单。 表单操作必须是 Html.BeginForm(c=>c.Index(null)) ,它被解析为 / 并且我的表单的值被添加到查询字符串中。 (提供者是表单中的下拉菜单)
所以表单构建的url是/?abc=value&cde=value...
更新
下面接受的答案(见 cmets)引导我找到这个解决方案:
routes.MapRoute(
"Search",
"search/",
new { controller = "Home", action = "Index" }
);
routes.MapRoute(
null,
"{controller}/{action}/{provider}",
new { controller = "Home", action = "Index", provider = "Default"}
);
并像这样声明表格:
Html.BeginRouteForm("Search", FormMethod.Get){
...
}
这样,表单将与 QueryString 中的提供者一起使用(当我使用命名路由搜索时),但在所有其他情况下,我将使用默认路由。 :)
【问题讨论】:
标签: asp.net-mvc routing