Можете ли вы перегружать методы контроллера в ASP.NET MVC? - PullRequest
316 голосов
/ 12 января 2009

Мне интересно посмотреть, можно ли перегрузить методы контроллера в ASP.NET MVC. Всякий раз, когда я пытаюсь, я получаю ошибку ниже. Два метода принимают разные аргументы. Это что-то, что не может быть сделано?

Текущий запрос на действие «MyMethod» для типа контроллера «MyController» неоднозначен между следующими методами действия:

Ответы [ 16 ]

2 голосов
/ 11 июня 2013

Мне нужна перегрузка для:

public ActionResult Index(string i);
public ActionResult Index(int groupId, int itemId);

Было достаточно аргументов, когда я закончил этим:

public ActionResult Index(string i, int? groupId, int? itemId)
{
    if (!string.IsNullOrWhitespace(i))
    {
        // parse i for the id
    }
    else if (groupId.HasValue && itemId.HasValue)
    {
        // use groupId and itemId for the id
    }
}

Это не идеальное решение, особенно если у вас много аргументов, но оно хорошо работает для меня.

1 голос
/ 27 мая 2016

Я столкнулся с той же проблемой в моем приложении. Без изменения какой-либо информации о методе я предоставил [ActionName ("SomeMeaningfulName")] в заголовке Action. проблема решена

[ActionName("_EmployeeDetailsByModel")]
        public PartialViewResult _EmployeeDetails(Employee model)
        {
            // Some Operation                
                return PartialView(model);
            }
        }

[ActionName("_EmployeeDetailsByModelWithPagination")]
        public PartialViewResult _EmployeeDetails(Employee model,int Page,int PageSize)
        {

                // Some Operation
                return PartialView(model);

        }
0 голосов
/ 28 августа 2017

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

Если вы не желаете использовать разные глаголы (например, атрибуты [HttpGet] и [HttpPost]) для дифференциации перегруженных методов (которые будут работать) или изменения маршрутизации, то остается только предоставить другой метод с другим именем, или вы можете отправить внутри существующего метода. Вот как я это сделал:

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

Чтобы решить эту проблему, я сделал следующее:

  1. Изменены 2 перегруженных метода действия с открытого на приватное
  2. Создан один новый публичный метод, который содержит «всего» 2 строковых параметра. Тот, кто действовал как диспетчер, т.е.

    public ActionResult DoSomething(string param1, string param2)
    {
        if (string.IsNullOrEmpty(param2))
        {
            return DoSomething(ProductName: param1);
        }
        else
        {
            int oldId = int.Parse(param1);
            return DoSomething(OldParam: param1, OldId: oldId);
        }
    }
    
    
    private ActionResult DoSomething(string OldParam, int OldId)
    {
        // some code here
        return Json(result);
    }
    
    
    private ActionResult DoSomething(string ProductName)
    {
        // some code here
        return Json(result);
    }
    

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

Вы также можете создать диспетчер, например:

public ActionResult DoSomething(string action, string param1, string param2)
{
    switch (action)
    {
        case "update":
            return UpdateAction(param1, param2);
        case "remove":
            return DeleteAction(param1);
    }
}

Вы можете видеть, что для UpdateAction нужны 2 параметра, а для DeleteAction - один.

0 голосов
/ 12 сентября 2016

Если это попытка использовать одно действие GET для нескольких представлений, которые POST используются для нескольких действий с разными моделями, попробуйте добавить действие GET для каждого действия POST, которое перенаправляет на первый GET, чтобы предотвратить обновление 404.

Длинный выстрел, но общий сценарий.

0 голосов
/ 02 июля 2013

Мне нравится этот ответ, опубликованный в другой теме

Это в основном используется, если вы наследуете от другого контроллера и хотите переопределить действие от базового контроллера

ASP.NET MVC - Переопределение действия с другими параметрами

0 голосов
/ 28 февраля 2012

Создать базовый метод как виртуальный

public virtual ActionResult Index()

Создать переопределенный метод как переопределение

public override ActionResult Index()

Редактировать: Очевидно, что это применимо, только если метод переопределения находится в производном классе, который, как представляется, не был намерением ОП.

...