ASP.NET MVC Preview 5 路由歧义
-
09-06-2019 - |
题
我在使用 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 的表单数据。