当您设置路由时,您可以为不同的URL /路由部分指定默认值.让我们考虑VS向导生成的例子:
routes.MapRoute( "Default",// Route name "{controller}/{action}/{id}",// URL with parameters new { controller = "DefaultPage",action = "Index",id = UrlParameter.Optional } // Parameter defaults
在此示例中,如果未指定控制器,则将使用DefaultPageController,如果未指定操作,则将使用“Index”操作.
网址通常如下所示:http:// mysite / MyController / MyAction.
如果Url没有这样的操作:http:// mysite / MyController,那么将使用索引操作.
现在我们假设我的控制器Index和AnotherAction中有两个动作.对应的url分别是http:// mysite / MyController和http:// mysite / MyController / AnotherAction.我的“索引”操作接受参数id.所以如果我需要传递参数到我的索引操作,我可以这样做:http:// mysite / MyController / Index / 123.请注意,与URL http:// mysite / MyController不同,我必须明确指定Index操作.我想做的是能够通过http:// mysite / MyController / 123而不是http:// mysite / MyController / Index / 123.我不需要这个URL中的“索引”我想让mvc引擎识别,当我要求http:// mysite / MyController / 123时,123不是一个动作(因为我没有定义一个这个名字的动作),但是我的默认动作“Index”的参数.如何设置路由来实现?
以下是问题的原始措辞.
我有一个控制器,有这样的两个方法
public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(SomeFormData data) { return View(); }
这允许我在用户导航到此URL(GET)时以及随后发布表单(POST)时,像http://网站/页面一样处理Url.
现在,当我处理这个帖子时,在某些情况下,我想将浏览器重定向到这个url:
http://website/Page/123
其中123是一些整数,我需要一个方法来处理我的控制器中的这个url.
如何设置路由,这样做有效?目前我有这样的向导生成的“默认”路由:
routes.MapRoute( "Default",id = UrlParameter.Optional } // Parameter defaults
public ActionResult Index(int id) { return View(); }
但是,由于引发了不明确的操作异常,这不起作用:
The current request for action ‘Index’
@H_404_47@
on controller type ‘PageController’
is ambiguous between the following
action methods:
System.Web.Mvc.ActionResult Index() on
type PageController
System.Web.Mvc.ActionResult
Index(Int32) on type PageController我必须补充说,我也在这个控制器中有其他的动作.如果没有,This会工作.
解决方法
您可以创建一个路由约束,以指示路由引擎,如果您有一些url中的东西看起来像一个数字(123),那么这是一个默认操作的操作参数,如果你有一些不像number(AnotherAction)然后它是一个动作.
考虑这个代码:
routes.MapRoute( "MyController","MyController/{productId}",new {controller="My",action="Index"},new {productId = @"\d+" });
此路由定义将只匹配MyController在http:// mysite / MyController / 123中的数值,因此它不会干扰在同一个控制器上调用另一个操作.