Я был немного удивлен несколько минут назад, когда я пытался перегрузить Действие в одном из моих Контроллеров
Я имел
public ActionResult Get()
{
return PartialView(/*return all things*/);
}
Я добавил
public ActionResult Get(int id)
{
return PartialView(/*return 1 thing*/);
}
.... и внезапно ни один не работал
Я устранил проблему путем создания 'идентификатора' nullable и избавления от других двух методов
public ActionResult Get(int? id)
{
if (id.HasValue)
return PartialView(/*return 1 thing*/);
else
return PartialView(/*return everything*/);
}
и это работало, но мой код просто стал немного ужасным!
Какие-либо комментарии или предложения? Я должен жить с этим пятном на своих Контроллерах?
Спасибо
Dave
Вы не можете перегружать действия таким образом, как вы обнаружили.
Единственный способ иметь несколько действий с одинаковым именем - это если они отвечают на разные глаголы.
Я бы утверждал, что наличие одного метода, который обрабатывает обе ситуации, является более чистым решением и позволяет вам инкапсулировать вашу логику в одном месте и не полагаться на знание о наличии нескольких методов с одинаковым именем, которые используются для разных целей. - Конечно, это субъективно и является лишь моим мнением.
Если вы действительно хотите иметь отдельные методы, вы можете назвать их по-разному, чтобы они четко указывали на их различные цели. Например:
public ActionResult GetAll()
{
return PartialView(/*return all things*/);
}
public ActionResult Get(int id)
{
return PartialView(/*return 1 thing*/);
}
На мой взгляд, это действительно имеет смысл в том, что вы говорите, Дэйв. Если у меня, например, есть select, у которого есть возможность выбрать все или одну запись, я не хочу использовать для этого разные методы, а лучше иметь один метод с перегрузкой, как тот, который Дейв показывает в примере.
// MrW