ASP.NET MVC Preview 5路由歧义

时间:2020-03-05 18:48:39  来源:igfitidea点击:

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

在AccountController中,我有2个动作:

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

在尝试查找Account / Delete或者Account / Delete吗?username = davide时,ControllerActionInvoker引发异常,表明我的拖曳操作方法之间的Delete请求不明确。

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

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

使用预览版4,执行相同的操作不会遇到这类问题。

任何的想法?

解决方案

回答

我不能肯定地说为什么会这样。但是我们可能只想考虑执行Delete(string username)操作并删除无参数的重载。

因为string是可为空的,所以我的理解是,仅调用Account / Delete就会使用空的username参数调用该操作,然后我们可以在该action方法的开头进行测试。

回答

找到解决方案!

随着ActionNameAttribute的引入,现在有必要根据请求手动筛选要调用的方法。这是通过ActionSelectionAttribute完成的。

此处有完整说明:http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

回答

我要做的是抛弃空白的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 @我的域ping我。

编辑:几乎无论如何Berko都说了什么,我不确定命名属性将如何,因此请在此处发表评论,为发现相同问题的其他人详细说明! :)

回答

其模棱两可,因为两个控制器的动作是相同的post方法。
我们只能在表单发布方案中使用该表单,例如,我们要提交使用HTTP发布的表单数据。