【问题标题】:The current request for action 'Index' on controller type 'DinnersController' is ambiguous between the following action methods [closed]当前对控制器类型“DinnersController”的操作“索引”请求在以下操作方法之间不明确[关闭]
【发布时间】:2011-09-27 19:53:52
【问题描述】:

我在尝试实现分页支持后收到此错误。

我在html教程的这一步:http://nerddinnerbook.s3.amazonaws.com/Part8.htm

【问题讨论】:

  • 您能提供实际的错误输出和堆栈跟踪吗?否则,当应用程序抛出错误时,很难知道你在哪里以及你在做什么。

标签: asp.net-mvc nerddinner


【解决方案1】:

您收到的错误表明 ASP.NET MVC 找到了两个具有相同名称的操作,并且无法选择使用哪个操作。

如果您的DinnersController.cs 中有两个索引操作:

public ActionResult Index() {

和:

public ActionResult Index(int? page) {

那么你应该删除第一个动作。因为第二个是第一个的“更新”版本。 第二个 Action 接受以下请求:

/晚餐

/Dinners?page=2

/晚餐/索引

/Dinners/Index?page=2

随着 RegisterRoutes 的变化,它还接受以下请求:

/Dinners/Page/2

你可以有两个同名的动作,提供一个用于保存(回发),你用[AcceptVerbs(HttpVerbs.Post)][HttpPost]装饰保存动作

【讨论】:

  • 恕我直言,人们这样做“2 个获取方法,相同的名称,不同的签名”,因为绝对大量的博客、书籍和文档都介绍了 UrlParameter.Optional 的想法作为一种“节省额外费用”的方式路线”。因此,对于经典的“公共 ActionResult List()”路线匹配,他们会说为路线添加 UrlParameter 枚举,如下所示:routes.MapRoute("simple", "{controller}/{action}/{id} ", new {id = UrlParameter.Optional}); 然后他们会告诉你一个 "public ActionResult List(int?id)"。他们几乎从来没有说你必须删除原来的 "ActionResult List()" 方法让这个工作。
【解决方案2】:

MVC 不支持在控制器中重载操作方法。在同一个控制器上不可能有两个具有不同方法签名的 Index() 动作。

为了使您正在测试的示例正常工作,您必须删除不接受任何参数的 Index() 操作,并将其替换为以可为空的 int 作为参数的操作。

【讨论】:

  • 如果 MVC 支持动作重载就好了。我希望能够在我的操作的多个版本之间进行交换,比如说通过具有 [PriorityAttribute(10)] 以便首先执行此操作。然后我可以从数据库配置中或根据需要更改该数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2012-05-26
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多