Перегрузка методов контроллера MVC asp.net с одним и тем же глаголом?

Все примеры, которые я видел для перегрузки, обычно имеют только два метода с одним и тем же именем с разными параметрами, а один - с помощью GET-глагола, а другой - POST. Можно ли выполнить две или более перегрузки по одному и тому же методу, все с одним и тем же глаголом?

Вот пример того, что я имею в виду: Можете ли вы перегрузить методы контроллера в ASP.NET MVC?

Ответы

Ответ 1

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

Другой вариант, который я использовал ранее (зависит от того, насколько сложны/разные ваши перегрузки), - это просто использовать значения с нулевыми значениями для параметров и эффективно объединить ваши разные подписи. Поэтому вместо:

public ActionResult DoSomething(int id)...
public ActionResult DoSomething(string name)...

просто:

public ActionResult DoSomething(int? id, string? name)

Не самое приятное решение, но если одна перегрузка просто строится на другой, то не так уж плохо компромисс.

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

Ответ 2

Я думаю, это не так. Поскольку я обнаружил, что на MVC-структуру действительно неважно, что вы помещаете в список параметров, например, мое действие похоже:

public ActionResult Index(int id) {...}

Можно запросить вот так: Domain.com/Index.aspx или Domain.com/Index.aspx?id=012901 или даже Domain.com/Index.aspx?login=938293

Так как перегрузка в языке программирования означает, что вы выбираете разные функции (с тем же именем) с использованием входных параметров, но MVC в этом случае не заботится об этом! Так что, кроме перегрузки ActionVerb, я думаю, что это не нормально.