Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用asp.net mvc操作方法不明确_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 2 - Fatal编程技术网

C# 调用asp.net mvc操作方法不明确

C# 调用asp.net mvc操作方法不明确,c#,asp.net,asp.net-mvc,asp.net-mvc-2,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调用添

有人能解释为什么对以下操作的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; }
} 
这是因为在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";
}

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

请帮自己一个大忙。下载ASP.NET MVC的源代码。(实际上,您应该在任何时候访问源代码时执行此操作。)将其设置为调试并逐步完成遇到问题的部分。我不能告诉你有多少次这样的问题为我解决了。你会更好地理解实际发生的事情,如果你不这样做的话,在某些情况下,你的发现会让你大吃一惊。过去我在这里问过问题,得到了“可行”的解决方案,却发现有一种更简单、更优雅的方法来解决问题。

好吧,回答我自己的问题,那是我的愚蠢


我的get方法有setID参数,因为它在URL中,当然也会在post中,因此RequireRequestValueAttribute为IsValidForRequest为两种方法返回TRUE。我通过向Get方法添加[HttpGet]属性来解决这个问题,这样事情就永远不会被发送到它了。

对不起,输入错误,第二个方法的int值是不可为null的parameter@sylon,请参阅我的更新:您不能有两个同名的操作可以用同一个动词调用。我不明白为什么如果我删除方法2,这篇文章很好,转到方法3。但如果我删除方法1,post就会失败,并出现不明确的调用错误。这三种方法都可以贴到右边?那么为什么问题只出现在第二个和第三个?@sylon,因为动作调用程序首先查找HTTP动词,然后查找动作名称。对于GET动词,他得到了两个候选词:
Add
Add
,他不知道选择哪一个,它抛出了您正在观察的异常。这就是它的实现方式,特别是在RESTful应用程序中,它非常有意义。