我需要的路由很简单,我必须在那里遗漏一些东西。作为代码示例,我将更简单的情况放在可以重现我的行为的地方。
你有这个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
您可以拨打 /主页/索引/自定义,提供商将获取值“自定义”
如果我希望网址 /?provider = Custom 将提供程序映射到参数,我需要什么路由。 我认为这样可行,因为将使用默认控制器和默认操作,并且将使用查询字符串中的提供程序而不是默认控制程序。 但这里只是忽略了查询字符串。
在我的情况下这是一个问题,因为我有一个使用HTTP GET方法的表单。 表单操作必须是Html.BeginForm(c => c.Index(null)),它被解析为 / ,并且我的表单的值被添加到查询字符串中。 (提供者是表格中的下拉列表)
因此,表格构建的网址是/?abc = value& cde = value ...
更新
下面接受的答案(见评论)使我得到了这个解决方案:
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中的提供程序一起使用(当我使用命名路由搜索时),但在所有其他情况下,我将使用默认路由。 :)
答案 0 :(得分:2)
当我将提供程序设置为urlparameter.optional而不是静态值时,我会得到您正在寻找的行为。我不认为我可以完全解释为什么这种方法有效,而静态默认值设置却没有,但试一试,看看它是否有帮助。如果它有效,您可能还需要为表单开发自定义路由,这样您就可以在路由中维护默认提供程序,而不是在控制器中进行自定义检查。
routes.MapRoute( _
"Default", _
"{controller}/{action}/{provider}", _
New With {.controller = "Home", .action = "Index", .provider = UrlParameter.Optional} _
)
更新:
此外,您不必将路径中的参数传递给控制器操作方法。例如,使用上面的路线,我可以拥有此网址
http://localhost:49705/home/about/default?otherValue=testme
这个控制器方法
Function About(ByVal provider As String, ByVal otherValue As String) As ActionResult
ViewData("Message") = provider & "|" & otherValue
Return View()
End Function
输出字符串default | testme
此网址与上述内容相同:http://localhost:49705/home/about/?provider=default&otherValue=testme
答案 1 :(得分:0)
也许我不理解这个问题,但是如果您只是从路线中移除{provider}
,或者使用默认的{id}
。然后,当您将网址设置为/?provider=blah
时,会将“blah”分配给“provider”参数。