模糊调用asp.net mvc动作方法

时间:2011-01-10 21:14:07

标签: c# asp.net asp.net-mvc asp.net-mvc-2

有人可以解释为什么对以下操作的POST调用不明确吗?他们有不同的参数集?

[RequireRequestValueAttribute("setID")]
public ActionResult Add(int setID){}

[HttpPost]
public ActionResult Add(TypeModel model, int? queueID) {}

只有在使用我正在使用的RequireRequestValueAttribute属性时才会出现此问题,因为我想为具有不同参数集的Get调用添加另一种方法。

以下是我正在使用的实现,在另一个stackoverflow问题上找到:

public class RequireRequestValueAttribute : ActionMethodSelectorAttribute
{
    public RequireRequestValueAttribute(string valueName)
    {
        ValueName = valueName;
    }
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return (controllerContext.HttpContext.Request[ValueName] != null);
    }
    public string ValueName { get; private set; }
} 

3 个答案:

答案 0 :(得分:6)

这是因为在C#中禁止有两个具有相同名称和参数类型的方法。这与ASP.NET MVC无关。您应该重命名GET可以调用的两个Add操作中的一个。

您不能拥有两个具有相同名称的动作名称,可以使用相同的动词调用(在您的情况下为GET)。您需要重命名其中一个或使用另一个HTTP动词,就像使用POST操作一样。


更新:

您可以尝试在自定义操作选择器属性中引入HTTP谓词:

public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
    return controllerContext.HttpContext.Request[ValueName] != null &&
           controllerContext.HttpContext.Request.HttpMethod == "GET";
}

但坦率地说,我不会使用自定义操作选择器来验证请求参数是否存在。路径约束或数据注释似乎更适合此任务。

答案 1 :(得分:3)

帮自己一个大忙。下载ASP.NET MVC的源代码。 (实际上,您应该在访问源代码时随时执行此操作。)将其设置为调试并逐步完成您遇到问题的部分。我无法告诉你这次为我解决了这样的问题多少次。您将更好地了解实际上会发生什么,并且在某些情况下您会发现它真的很令人惊讶。我过去曾在这里提出过问题,得到了“可行的”解决方案,但却发现有更简单,更优雅的方法来解决问题。

答案 2 :(得分:0)

好的回答我自己的问题,这是我的愚蠢!

我的get方法有setID参数,因为它在URL中,当然,这也将在帖子中,因此 RequireRequestValueAttribute为两个方法的IsValidForRequest返回TRUE < / strong>即可。我通过在Get方法中添加[HttpGet]属性来解决它,所以事情永远不会发布到它。