ASP.NETMVC路由:如何使用默认操作但非默认参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我正在改写这个问题,因为迄今为止的答案表明我还没有把它定义得足够好。我将留下原始问题以供参考。

在设置路由时,可以为不同的url /路由部分指定默认值。我们来看一下VS向导生成的例子:

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

在这个例子中,如果未指定controller,则将使用DefaultPageController,如果未指定操作,则将使用“Index”操作。这些网址通常看起来像:http://mysite/MyController/MyAction

如果Url中没有这样的操作:http://mysite/MyController那么将使用索引操作。

现在让我们假设在我的控制器Index和AnotherAction中有两个动作。对应于他们的网址是http://mysite/MyControllerhttp://mysite/MyController/AnotherAction分别。我的“索引”操作接受一个参数id。所以如果我需要传递一个参数给我的索引动作,我可以这样做:http://mysite/MyController/Index/123。请注意,与URL不同http://mysite/MyController,我必须明确指定Index操作。我想要做的是能够通过http://mysite/MyController/123而不是http://mysite/MyController/Index/123。我不需要这个URL中的“Index”我希望mvc引擎能够识别,当我要求时http://mysite/MyController/123,123不是一个动作(因为我没有用这个名字定义一个动作),而是一个参数给我的默认动作“指数”。我如何设置路由来实现这一点?

以下是该问题的原始措辞。

我有一个控制器有两个定义这样的方法

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(SomeFormData data)
    {
        return View();

    }

这允许我http://website/Page在用户导航到此URL(GET)时以及他们随后发回表单(POST)时处理Url 。

现在,当我处理帖子时,在某些情况下,我想将浏览器重定向到此网址:

http://website/Page/123

123是一些整数,我需要一个方法来处理我的控制器中的这个URL。

我如何设置路由,所以这个工作?目前我有这样的向导生成的“默认”路由:

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

我尝试添加像这样的另一种控制器方法:

public ActionResult Index(int id)
{
    return View();
}

但是这不起作用,因为引发了不明确的动作异常:

System.Web.Mvc.ActionResult Index() on type PageController System.Web.Mvc.ActionResult Index(Int32) on type PageController

提问于
用户回答回答于

这是如何分解的:

可以创建一个路由约束,以向路由引擎指示,如果网址中有类似于数字的内容(123),那么这是默认操作的操作参数,并且如果有看似不像数字(AnotherAction)则是一个动作。

考虑这个代码:

routes.MapRoute(
  "MyController", "MyController/{productId}", 
  new {controller="My", action="Index"}, 
  new {productId = @"\d+" });

此路由定义只会匹配MyController后的数值,http://mysite/MyController/123因此不会干扰在同一控制器上调用另一个操作。

来源: 创建一个路由约束

用户回答回答于

如果你保持变量名保持ID,你不需要改变任何东西。

将后一个重命名为“PostIndex”并添加此属性:

[ActionName("Index")]

这里有一个剪切/粘贴的答案。

public ActionResult Index()    {        
return View();    
}    
[AcceptVerbs(HttpVerbs.Post), ActionName("Index")]   
public ActionResult PostIndex(SomeFormData data)    {        
return View();    
}

扫码关注云+社区