2010-06-07 22 views
0

我需要的路由很简单,我必须在那里丢失一些东西。作为代码示例,我提出了更简单的情况,可以重现我的行为。asp.net MVC中的入站/出站url路由

你有这样的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 

您可以拨打/首页/索引/自定义和供应商将采取值 “自定义”

如果我想要url /?provider = Custom将供应商映射到t他参数。 我认为这样做会工作,因为将使用默认控制器和默认操作,并且将使用来自查询字符串的提供程序而不是默认操作程序。 但查询字符串在这里被忽略。

这是我的情况中的一个问题,因为我有一个使用HTTP GET方法的表单。 表单动作必须是Html.BeginForm(c => c.Index(null)),它被解析为/并且我的表单的值被添加到查询字符串中。 (供应商是形式下拉)

因此,通过形式是/?ABC =值& CDE =值内置网址...

UPDATE

接受的答案如下(见注释)使我这个解决方案:

​​

,并声明的形式,像这样:

Html.BeginRouteForm("Search", FormMethod.Get){ 
... 
} 

这样,表单将与QueryString中的提供者一起工作(当我使用指定的路径搜索时),但在其他情况下,我将使用默认路由。 :)

回答

2

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

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

UPDATE:

而且,你不必在你的路由参数将它们传递给控制器​​的操作方法。例如,使用上面的路线,我能有这个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 

,输出字符串默认| TESTME

此网址同上: http://localhost:49705/home/about/?provider=default&otherValue=testme

+0

是的你是对的,那是有效的,除了我真的需要一个默认值...我不想在每个使用它的动作中将回退代码编写到默认提供程序。 – 2010-06-07 15:58:48

+0

如果提供者被设置在URL中,为什么它需要成为表单集合的一部分?意思是,如果我访问site.com/home/about/customProvider并且表单从这里执行GET操作,则GET URL将为site.com/home/about/customProvider?form1=a&form2=b ...您会仍然有你的提供者正确? – Tommy 2010-06-07 16:07:30

+0

这是一个搜索页面,您可以在表单中设置的不同提供商中搜索。但是我也需要从另一个页面链接到正确的提供者的搜索。 – 2010-06-07 16:15:16

0

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

+0

是的,但然后我没有得到我的提供商的默认值... 而我没有得到好的网址,当我有我的网页上的链接。如果我没有使用GET进入该页面的表单,那就没问题了。但我需要路由(用于链接)和QueryString(用于表单) – 2010-06-07 16:01:45