Действия контроллера перегрузки - PullRequest
9 голосов
/ 12 марта 2010

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

у меня было

public ActionResult Get()
{
    return PartialView(/*return all things*/);
}

Я добавил

public ActionResult Get(int id)
{
    return PartialView(/*return 1 thing*/);
}

.... и вдруг ни один из них не работал

Я исправил проблему, сделав 'id' обнуляемым и избавившись от двух других методов

public ActionResult Get(int? id)
{
    if (id.HasValue)
        return PartialView(/*return 1 thing*/);
    else
        return PartialView(/*return everything*/);
}

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

Есть комментарии или предложения? Должен ли я жить с этим пороком на моих контроллерах?

Спасибо

Dave

Ответы [ 3 ]

4 голосов
/ 12 марта 2010

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

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

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

Если вы действительно хотели иметь отдельные методы, вы могли бы назвать их по-разному, чтобы они четко указывали их разные цели. e.g.:

public ActionResult GetAll() 
{ 
    return PartialView(/*return all things*/); 
} 

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 
1 голос
/ 12 марта 2010

По-моему, там действительно имеет смысл то, что вы говорите, Дэйв. Если у меня, например, есть select, у которого есть опция выбора всего или одной записи, я не хочу использовать другие методы для этого, а вместо этого имею один метод с перегрузкой, который Дейв показывает в примере.

// MrW

0 голосов
/ 27 февраля 2018

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

Да, вы можете перегрузить результаты действий в MVC, используя атрибут ActionName .

[ActionName("Get")]  
public ActionResult Get()
{
    return PartialView(/*return all things*/);
}

[ActionName("GetById")]  
public ActionResult Get(int? id)
{
   //code
}
...