13

我在过去一个月左右一直在研究一个大型的MVC应用程序,但这是我第一次需要定义一个自定义的路由处理程序,而且我遇到了一些问题。基本上我有两个参数可以通过。第一个是必需的,第二个是可选的。带有一个必需参数和一个可选参数的ASP.NET MVC路由?

我在关注此问题here

这里是我的自定义路线:

routes.MapRoute(
    "MyRoute", 
    "{controller}/{action}/{param1}/{param2}", 
    new { 
     controller = "MyController", 
     action = "MyAction", 
     param1 = "", 
     param2 = "" // I have also tried "UrlParameter.Optional" here. 
    } 
); 

而我的操作方法的签名:

public ActionResult MyAction(string param1, string param2) 

如果我尝试的URL http://[myserver]/MyController/MyAction/Test1/Test2然后它就像我期望它,用参数1 =“测试1 “和param2 =”Test2“

如果我尝试URL http://[myserver]/MyController/MyAction/Test1那么这两个参数都是空的。

希望有人能告诉我我在这里做错了什么,因为我迷路了。

+0

从未来嗨 - 尝试属性路由现在 - Way路更轻松,不易出错。 – niico

回答

13

我假设你创建了新的途径,并留下一个默认,这是非常类似于你。你应该知道,路线的集合被遍历以找到第一个匹配的路线。所以,如果你已经离开了默认的:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

您的路线上面,然后它会匹配请求http://[myserver]/My/MyAction/Test1并调用MyController.MyAction,并设置“文本1”,以参数命名id。这将失败,因为此操作未声明一个名为id

你需要做的是将您的路线首先在路由表,使之更加具体,然后现在是:

routes.MapRoute(
      "Route", 
      "My/{action}/{param1}/{param2}", 
      new 
      { 
       controller = "My", 
       action = "MyAction", 
       param1 = "", 
       param2 = "" 
      }); 

这将迫使所有的流量路由低谷My匹配这条路线。

+1

无论我做什么,我都无法获取多个参数,在这样的路径中工作。如果我尝试创建2个参数并使用像My/MyAction/param1/param2这样的URL来请求页面,则会出现404错误。我究竟做错了什么? – DavidHyogo

1

喜创建您狂胜喜欢我认为这将HEP你

routes.MapRoute(
       "Regis", // Route nameRegister 
       "Artical/{id}", // URL with parameters 
       new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults 
      ); 
0

尝试此

routes.MapRoute("MyRoute", 
       "myRoute/{param1 }/{param2 }", 
       new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, 
       new { param2 = @"\w+" }); 

可以通过使用“UrlParameter.Optional”指定一个参数作为可选的,并且指定第二个与数据类型意味着如果传递整数值然后字段类型字段(@“\ d +”)对于我上面提到的字符串。

注:序列参数是非常重要的可选参数必须通过最后注册默认路由之前,你的新路线在Gloab.asax

,那么你的跳转链接像

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a> 

或与一个参数

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a> 

在您控制器

public ActionResult MyAction(string param2,string param1) 
{ 
    return View() 
} 
相关问题