【问题标题】:ASP.NET MVC Preview 5 routing ambiguityASP.NET MVC Preview 5 路由歧义
【发布时间】:2010-09-08 00:30:32
【问题描述】:

我在使用 asp.net mvc 预览版 5 的示例路由时遇到问题。

在 AccountController 我有 2 个动作:

public ActionResult Delete()  
public ActionResult Delete(string username)

在尝试查找 Account/Delete 或 Account/Delete?username=davide 时,ControllerActionInvoker 会引发异常,指出删除请求在我的两个操作方法之间不明确。

global.asax 中的默认路由没有改变。

动作调用者不应该了解在参数列表中调用的方法是什么吗?

使用预览版 4,我在执行相同操作时没有遇到此类问题。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    这是模棱两可的,因为这两个控制器动作是相同的 post 方法.. 您只能在表单发布场景中使用它,例如您正在提交使用 HTTP 发布的表单数据..

    【讨论】:

      【解决方案2】:

      我要做的是放弃空白的 Delete(),只使用 Delete(string username)

      在您的 url 路由中,您会有类似于 "/{Controller}/{Action}/{username}/" 的内容吗? 如果您有“/{Controller}/{Action}/{Id}/”,那么最好执行 Delete(string id),这样只需使用 url 来处理此“/Account/Delete/davide/”

      也就是说使用你的默认路由,它应该类似于默认 ID 是“”

      然后在你的 Delete(string id) 方法中有:

      public ActionResult Delete(string id)
      {
          if(string.IsNullOrEmpty(id)) return EmptyID();
      
          // Continue normal Delete method
      }
      
      public ActionResult EmptyID()
      {
          // The method you were going to have on a blank delete.
      }
      

      或者只是将其包装在 if {} else {} 上的一个方法中

      无论哪种方式,我都会使用一种方法,并在您的空字符串路由中对您的用户名/ID 执行默认设置,然后以这种方式处理。

      如果您想与我联系以进一步了解我的意思,或者有任何帮助,请在我的信息页面上通过 andrew@my domain 联系我。

      编辑:嗯,Berko 说的差不多,我不确定命名属性有什么帮助——所以请在此处发表评论,为其他发现相同问题的人详细说明! :)

      【讨论】:

      • 你收到我的邮件了吗?
      【解决方案3】:

      找到解决方案!

      随着 ActionNameAttribute 的引入,现在需要根据请求手动过滤要调用的方法。这是由 ActionSelectionAttribute 完成的。

      这里有完整的解释:http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

      【讨论】:

        【解决方案4】:

        我不能确定为什么会这样。但您可能只想考虑只使用 Delete(string username) 操作并删除无参数重载。

        因为字符串可以为空,我的理解是简单地调用 Account/Delete 将调用带有 null 用户名参数的操作,然后您可以在操作方法的开头进行测试。

        【讨论】:

        • Berko,这不是我想要的。这两种操作方法执行不同的操作。在方法的开头测试参数确实不是正确的方法......太脏了。会想出别的办法。还是谢谢
        猜你喜欢
        • 2010-09-27
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 2015-12-09
        • 2015-04-06
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多