asp.net MVC中的入站/出站URL路由

时间:2010-06-07 15:35:49

标签: asp.net-mvc routing

我需要的路由很简单,我必须在那里遗漏一些东西。作为代码示例,我将更简单的情况放在可以重现我的行为的地方。

你有这个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中的提供程序一起使用(当我使用命名路由搜索时),但在所有其他情况下,我将使用默认路由。 :)

2 个答案:

答案 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”参数。