有人可以解释为什么对以下操作的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; }
}
答案 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]属性来解决它,所以事情永远不会发布到它。