And*_*ykh 17 asp.net-mvc routing url-routing asp.net-mvc-routing
我正在改写这个问题,因为到目前为止答案显示我没有把它定义得足够好.我将留下原始问题以供参考.
设置路由时,您可以为不同的URL /路由部分指定默认值.让我们考虑VS向导生成的示例:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果未指定controller,将使用DefaultPageController,如果未指定action,则将使用"Index"操作.网址通常如下:http://mysite/MyController/MyAction
.
如果Url中没有这样的操作:http://mysite/MyController
那么将使用索引操作.
现在让我们假设我的控制器Index和AnotherAction中有两个动作.与它们对应的URL 分别是http://mysite/MyController
和http://mysite/MyController/AnotherAction
.我的"索引"操作接受参数id.所以如果我需要将参数传递给我的Index动作,我可以这样做: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不是动作(因为我没有定义具有此名称的动作),而是我的默认动作的参数"指数".如何设置路由来实现此目的?
以下是问题的原始措辞.
我有一个控制器,有两种方法,这样定义
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(SomeFormData data)
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
这允许我http://website/Page
在用户导航到此URL(GET)时以及随后回发表单(POST)时处理Url .
现在,当我处理回发帖时,在某些情况下我想将浏览器重定向到此网址:
http://website/Page/123
Run Code Online (Sandbox Code Playgroud)
其中123是一个整数,我需要一个方法来处理我的控制器中的这个URL.
如何设置路由,这有效吗?目前我有向导生成的"默认"路由,如下所示:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
Run Code Online (Sandbox Code Playgroud)
我尝试添加另一个这样的控制器方法:
public ActionResult Index(int id)
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为引发了模糊的动作异常:
控制器类型'PageController'上的当前操作请求'Index'在以下操作方法之间是不明确的:SystemController上的System.Web.Mvc.ActionResult Index()类型PageController上的System.Web.Mvc.ActionResult索引(Int32)
我必须补充一点,我在这个控制器中也有其他动作.这如果我不会工作.
And*_*ykh 11
以下是如何解决这个问题:
您可以创建一个路由约束,以向路由引擎指示,如果您在url中有某个看起来像数字的内容(123),那么这是默认操作的操作参数,如果您有某些内容看起来不像number(AnotherAction)那么它就是一个动作.
考虑这段代码:
routes.MapRoute(
"MyController", "MyController/{productId}",
new {controller="My", action="Index"},
new {productId = @"\d+" });
Run Code Online (Sandbox Code Playgroud)
此路由定义仅匹配MyController之后的数值,http://mysite/MyController/123
因此它不会干扰在同一控制器上调用另一个操作.
来源: 创建路径约束