неоднозначный вызов asp.net методы действия mvc - PullRequest
4 голосов
/ 11 января 2011

Может кто-нибудь объяснить, почему 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 ]

6 голосов
/ 11 января 2011

Это потому, что в C # запрещено иметь два метода с одинаковыми именами и типами параметров.Это не имеет ничего общего с ASP.NET MVC.Вам следует переименовать одно из двух Add действий, которые могут быть вызваны GET.

У вас не может быть двух имен действий с одинаковым именем, которые можно вызывать с одним и тем же глаголом (в вашем случае GET).Вам нужно либо переименовать один из них, либо использовать другой HTTP-глагол, как вы делали с вашим действием POST.


ОБНОВЛЕНИЕ:

Вы можете попробовать ввести HTTP-глагол в селекторе пользовательских действий.атрибут:

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

но, откровенно говоря, я бы не использовал селектор пользовательских действий для проверки наличия параметра запроса или нет.Ограничения маршрута или аннотации данных кажутся гораздо более подходящими для этой задачи.

3 голосов
/ 11 января 2011

Сделай себе огромную услугу. Загрузите исходный код для ASP.NET MVC. (На самом деле, вы должны делать это каждый раз, когда у вас есть доступ к исходному коду.) Настройте его для отладки и пошагового выполнения части, с которой у вас возникли проблемы. Я не могу сказать вам, сколько раз это решало такую ​​проблему для меня. Вы получите намного лучшее понимание того, что на самом деле происходит, что у вас было бы иначе, и может быть действительно удивительно, что вы найдете в некоторых случаях. В прошлом я задавал вопросы здесь, получал «работоспособные» решения, только чтобы обнаружить, что существует гораздо более простой и элегантный способ решения проблемы.

0 голосов
/ 11 января 2011

ОК, чтобы ответить на мой собственный вопрос, это была моя глупость!

Мой метод get имеет параметр setID и, поскольку он находится в URL, конечно это также будетpost, и поэтому RequireRequestValueAttribute возвращал TRUE для IsValidForRequest для обоих методов .Я справился с этим, добавив атрибут [HttpGet] в метод Get, чтобы вещи никогда не публиковались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...