Неоднозначный вызов метода действия, по некоторым причинам ASP.NET MVC 3 - PullRequest
3 голосов
/ 01 августа 2011

ERS!Я немного новичок в этом MVC и столкнулся с проблемой, с которой мне нужна помощь.

В настоящее время я работаю над проектом для компании, которая управляет приемными детьми, иОсновная часть этого проекта - это веб-приложение MVC для некоторых форм, которые приемные родители должны регулярно отправлять в компанию.Моя самая большая проблема до сих пор - сохранение данных, которые были введены в форму, обратно в базу данных.Но недавно у меня произошел прорыв, когда я понял, что могу сделать это:

public ActionResult SaveForm(FormChildTherapeuticWeeklyForm formData)

, что очень круто, и отлично работает для этой первой формы.Но после добавления еще двух форм:

public ActionResult SaveForm(FormChildBasicCareMonthlyProgressReport formData)
public ActionResult SaveForm(FormFosterFamilyRequestForRemovalOrDischarge formData)

Я начал получать Текущий запрос на действие 'SaveForm' для контроллера типа 'FormsController' неоднозначен между следующими методами действия: ошибка.

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

Немного больше информации: каждое из трех представлений строго типизировано для одной из трех моделей / классов.

Как я уже сказал, я все еще немного новичок в MVCно я постараюсь предоставить любую другую информацию, которая может вам понадобиться.

Спасибо!

Ответы [ 5 ]

1 голос
/ 01 августа 2011

Вам необходимо использовать ActionMethodSelectorAttribute для устранения неоднозначности между вызовами для этих двух методов.

См. Пример здесь: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

1 голос
/ 01 августа 2011

Да, лучше указывать разные имена для действий, если они используют разные классы модели в качестве аргумента.

Среда MVC использует так называемые связыватели для привязки данных, полученных из веб-формы (или AJAX,или что угодно) к объекту CLR.Это не тривиальный способ выполнить такое связывание, поскольку он анализирует данные из url-encoded-form и пытается отобразить соответствующее свойство объекта CRL.

Некоторые объекты могут иметь одинаковые имена свойств, в этом случае Binder wanневозможно понять, как правильно составить карту;

1 голос
/ 01 августа 2011

Можно, если вы их так или иначе дифференцируете.Посмотрите эту статью для получения дополнительной информации: Можете ли вы перегрузить методы контроллера в ASP.NET MVC?

1 голос
/ 01 августа 2011

Вы можете использовать ActionNameAttribute , чтобы различать их.Таким образом, вы будете делать

[ActionName("Child")]
public ActionResult SaveForm(FormChildBasicCareMonthlyProgressReport formData)

И вы будете иметь разные маршруты / использовать маршрут по умолчанию для каждого.Другой способ сделать это - создать собственную реализацию ActionFilterAttribute , которая будет полагаться на то, что передается, но это более сложно.

0 голосов
/ 01 августа 2011

Вы можете решить эту проблему, используя атрибуты [HttpGet] и [HttpPost].Применение этих атрибутов покажет, какой метод следует вызывать для конкретного типа запроса.

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