Мне интересно посмотреть, можно ли перегрузить методы контроллера в ASP.NET MVC. Всякий раз, когда я пытаюсь, я получаю ошибку ниже. Два метода принимают разные аргументы. Это то, что нельзя сделать?
Текущий запрос на действие «MyMethod» для контроллера типа «MyController» неоднозначен между следующими методами действия:
c#
asp.net-mvc
overloading
Папа бордовый
источник
источник
Ответы:
Вы можете использовать атрибут, если хотите, чтобы ваш код перегружался.
Но вам придется использовать другое имя действия для того же метода http (как уже говорили другие). Так что это просто семантика на тот момент. Вы бы предпочли, чтобы имя было в вашем коде или атрибуте?
У Фила есть статья, связанная с этим: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx
источник
return View();
. Например:return View("MyOverloadedName");
.Да. Я смог сделать это, установив
HttpGet
/HttpPost
(или эквивалентныйAcceptVerbs
атрибут) для каждого метода контроллера на что-то отдельное, то есть,HttpGet
илиHttpPost
, но не оба. Таким образом, он может сказать, основываясь на типе запроса, какой метод использовать.Одно из предложений, которое у меня есть, заключается в том, что для подобного случая будет иметь частную реализацию, на которую полагаются оба ваших открытых метода Action, чтобы избежать дублирования кода.
источник
Show()
методы имеют разные подписи. Если и когда вам нужно будет отправить информацию в версию Get, ваши версии Get и Post в итоге будут иметь одинаковую подпись, и вам понадобитсяActionName
атрибут или одно из других исправлений, упомянутых в этом посте.ActionNameAttribute
. На практике я редко обнаруживал, что это так.Вот еще что вы могли бы сделать ... вы хотите метод, который может иметь параметр, а не.
Почему бы не попробовать это ...
Это сработало для меня ... и в этом одном методе вы можете на самом деле проверить, есть ли у вас входящий параметр.
Обновлен, чтобы удалить недопустимый синтаксис, допускающий использование значения NULL, и использовать значение параметра по умолчанию.
источник
string
не может быть обнуляемым.)string
не может бытьnullable
; но это может бытьnull
! Так или иначе я отправил начальный комментарий без искренности.Нет, Нет и Нет. Идите и попробуйте код контроллера ниже, где у нас перегружен «LoadCustomer».
Если вы попытаетесь вызвать действие «LoadCustomer», вы получите ошибку, как показано на рисунке ниже.
Полиморфизм является частью программирования на C #, а HTTP является протоколом. HTTP не понимает полиморфизм. HTTP работает над концепцией или URL, а URL может иметь только уникальные имена. Так что HTTP не реализует полиморфизм.
Чтобы исправить это, нам нужно использовать атрибут «ActionName».
Так что теперь, если вы сделаете вызов URL «Customer / LoadCustomer», будет вызвано действие «LoadCustomer», а со структурой URL «Customer / LoadCustomerByName» будет вызвано «LoadCustomer (string str)».
Ответ выше я взял из этой статьи codeproject -> Перегрузка действия MVC
источник
Чтобы преодолеть эту проблему, вы можете написать a,
ActionMethodSelectorAttribute
который проверяетMethodInfo
для каждого действия и сравнивает его с опубликованными значениями формы, а затем отклоняет любой метод, для которого значения формы не совпадают (конечно, за исключением имени кнопки).Вот пример: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/
НО, это не очень хорошая идея.
источник
Насколько я знаю, вы можете использовать один и тот же метод только при использовании различных методов http.
т.е.
источник
[HttpPost]
атрибут вместо[AcceptVerbs("POST")]
.Я добился этого с помощью Attribute Routing в MVC5. По общему признанию я новичок в MVC, пришедшем из десятилетия веб-разработки с использованием WebForms, но мне помогло следующее. В отличие от принятого ответа, это позволяет отображать все перегруженные действия одним и тем же файлом представления.
Сначала включите маршрутизацию атрибутов в App_Start / RouteConfig.cs.
При желании украсьте свой класс контроллера префиксом маршрута по умолчанию.
Затем украсьте действия вашего контроллера, которые перегружают друг друга, общим маршрутом и параметрами, которые вам подходят. Используя ограниченные по типу параметры, вы можете использовать один и тот же формат URI с идентификаторами разных типов.
Надеюсь, что это помогает и не ведет кого-то по ложному пути. :-)
источник
Вы можете использовать один ,
ActionResult
чтобы иметь дело с обоимиPost
иGet
:Полезно, если у ваших методов
Get
иPost
методов совпадают подписи.источник
Я только что натолкнулся на этот вопрос и, хотя сейчас он довольно старый, он все еще очень актуален. По иронии судьбы, один правильный комментарий в этой теме был опубликован новичком в MVC, который сам признался, когда писал эту статью. Даже документы ASP.NET не совсем корректны. У меня большой проект, и я успешно перегружаю методы действий.
Если кто-то понимает маршрутизацию, помимо простого шаблона маршрута по умолчанию {controller} / {action} / {id}, может быть очевидно, что действия контроллера могут быть отображены с использованием любого уникального шаблона. Кто-то здесь говорил о полиморфизме и сказал: «HTTP не понимает полиморфизм», но маршрутизация не имеет ничего общего с HTTP. Проще говоря, это механизм для сопоставления строковых шаблонов.
Лучший способ сделать это - использовать атрибуты маршрутизации, например:
Эти действия будут относиться к URL-адресам, таким как
/cars/usa/new-york
и/cars/usa/texas/dallas
, которые будут отображаться в первом и втором индексных действиях соответственно.Изучив этот пример контроллера, вы увидите, что он выходит за рамки шаблона маршрута по умолчанию, упомянутого выше. Значение по умолчанию хорошо работает, если ваша структура URL точно соответствует соглашениям об именах кода, но это не всегда так. Код должен описывать домен, но URL-адреса часто должны идти дальше, потому что их содержание должно основываться на других критериях, таких как требования SEO.
Преимущество шаблона маршрутизации по умолчанию заключается в том, что он автоматически создает уникальные маршруты. Это обеспечивается компилятором, поскольку URL-адреса будут соответствовать уникальным типам и членам контроллера. Прокрутка собственных шаблонов маршрутов потребует тщательного обдумывания, чтобы гарантировать уникальность и то, что они работают.
Важное замечание Единственный недостаток заключается в том, что использование маршрутизации для генерации URL-адресов для перегруженных действий не работает, если основано на имени действия, например, при использовании UrlHelper.Action. Но это работает, если использовать именованные маршруты, например, UrlHelper.RouteUrl. И использование именованных маршрутов - это, согласно хорошо уважаемым источникам, путь в любом случае ( http://haacked.com/archive/2010/11/21/named-routes-to-the-rescue.aspx/ ).
Удачи!
источник
Вы можете использовать [ActionName ("NewActionName")], чтобы использовать тот же метод с другим именем:
источник
Мне нужна была перегрузка для:
Было несколько достаточно аргументов, где я в конечном итоге сделал это:
Это не идеальное решение, особенно если у вас много аргументов, но оно хорошо работает для меня.
источник
Я столкнулся с той же проблемой в моем приложении тоже. Без изменения какой-либо информации о методе я предоставил [ActionName ("SomeMeaningfulName")] в заголовке Action. проблема решена
источник
Создайте базовый метод как виртуальный
Создайте переопределенный метод как переопределение
Редактировать: Очевидно, что это применимо, только если метод переопределения находится в производном классе, который, как представляется, не был намерением OP.
источник
Мне нравится этот ответ размещен в другой теме
Это в основном используется, если вы наследуете от другого контроллера и хотите переопределить действие от базового контроллера
ASP.NET MVC - переопределение действия с разными параметрами
источник
Для каждого метода контроллера разрешена только одна публичная подпись. Если вы попытаетесь перегрузить его, он скомпилируется, но вы получите ошибку времени выполнения, с которой столкнулись.
Если вы не хотите использовать различные глаголы (например, атрибуты
[HttpGet]
and[HttpPost]
) для дифференциации перегруженных методов (которые будут работать) или изменения маршрутизации, то остается только предоставить другой метод с другим именем или отправка внутри существующего метода. Вот как я это сделал:Однажды я попал в ситуацию, когда мне пришлось поддерживать обратную совместимость. Первоначальный метод предполагал два параметра, а новый - только один. Перегрузка, как я ожидал, не сработала, потому что MVC больше не находил точку входа.
Чтобы решить эту проблему, я сделал следующее:
Создан один новый публичный метод, который содержит «просто» 2 строковых параметра. Тот действовал как диспетчер, то есть:
Конечно, это взломать, и его следует изменить позже. Но пока это работает для меня.
Вы также можете создать диспетчер, как:
Вы можете видеть, что для UpdateAction нужны 2 параметра, а для DeleteAction - один.
источник
Извините за задержку. У меня была такая же проблема, и я нашел ссылку с хорошими ответами, может это поможет новым парням
Все кредиты для сайта BinaryIntellect и авторов
По сути, существует четыре ситуации: использование разных глаголов , использование маршрутизации , маркировка перегрузки с помощью атрибута [NoAction] и изменение имени атрибута действия с помощью [ActionName]
Так что, это зависит от ваших требований и вашей ситуации.
Как бы то ни было, перейдите по ссылке:
Ссылка: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx
источник
Если это попытка использовать одно действие GET для нескольких представлений, выполняющих POST для нескольких действий с разными моделями, попробуйте добавить действие GET для каждого действия POST, которое перенаправляет на первый GET, чтобы предотвратить обновление 404 при обновлении.
Длинный выстрел, но общий сценарий.
источник