asp.net mvc routing:如何使用默认动作但非默认参数?

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/MyControllerhttp://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因此它不会干扰在同一控制器上调用另一个操作.

来源: 创建路径约束