【问题标题】:inbound/outbound url routing in asp.net MVCasp.net MVC 中的入站/出站 url 路由
【发布时间】: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


    【解决方案1】:

    当我将提供程序设置为 urlparameter.optional 而不是静态值时,我得到了您正在寻找的行为。我认为我无法完全解释为什么这有效,而设置静态默认值则无效,但试一试,看看它是否有帮助。如果可行,您可能还想为您的表单开发一个自定义路由,这样您就可以在路由中维护您的默认提供程序,而不是在您的控制器中进行自定义检查。

    routes.MapRoute( _
        "Default", _
        "{controller}/{action}/{provider}", _
        New With {.controller = "Home", .action = "Index", .provider = UrlParameter.Optional} _
    )
    

    更新:

    此外,您不必在路由中包含参数即可将它们传递给控制器​​操作方法。例如,使用上面的路由,我可以有这个 URL

    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

    【讨论】:

    • 是的,你是对的,这行得通,只是我真的需要一个默认值...我不想在每个使用它的操作中编写回退到默认提供程序的代码。
    • 如果提供者设置在 URL 中,为什么它需要成为表单集合的一部分?意思是,如果我去 site.com/home/about/customProvider 并且表单从这里执行 GET 操作,则 GET URL 将是 site.com/home/about/customProvider?form1=a&form2=b... 你会您的提供商仍然正确吗?
    • 这是一个搜索页面,您可以在表单中设置的不同提供商中搜索。但我还需要从另一个页面直接链接到具有正确提供者的搜索。
    • 如果是这种情况,我会为您的搜索页面制作自定义路线。这将解决您的所有问题并允许您进行链接等。
    • 自定义搜索页面是指表单的操作应该是一个完全不同的 URL?像 /search/provider?other=value... 是的,应该可以! :) 明天试试
    【解决方案2】:

    也许我不明白这个问题,但如果你只是从你的路线中删除{provider},或者改用默认的{id}。然后当你将 URL 设置为/?provider=blah 时,“blah”被分配给“provider”参数。

    【讨论】:

    • 是的,但是我没有得到我的提供者的默认值......而且当我的页面上有链接时,我也没有得到很好的 url。如果我没有使用 GET 访问该页面的表单,那就太好了。但我需要路由(用于链接)和 QueryString(用于表单)
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多