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

在 AccountController 中我有 2 个操作:

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

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

global.asax 中的默认路由尚未更改。

操作调用者不应该了解在参数列表中查找要调用的方法吗?

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

任何想法?

有帮助吗?

解决方案

找到解决方案了!

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

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

其他提示

我不能确定为什么会发生这种情况。但您可能只想考虑仅使用删除(字符串用户名)操作并删除无参数重载。

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

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

在您的网址路由中,您会有类似“/{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@ 我的域名来联系我。

编辑:啊,无论如何,Berko 说的差不多了,我不确定命名属性会有什么帮助 - 所以请在这里发表评论,为发现相同问题的其他人详细说明!:)

它不明确,因为两个控制器操作是相同的 post 方法。您只能在表单发布场景中使用它,例如您正在提交使用 HTTP post 的表单数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top