Действие MVC с дополнительными параметрами - что лучше? - PullRequest
25 голосов
/ 28 марта 2012

Есть ли плюсы / минусы использования следующих двух альтернатив в вашей подписи действия:

public ActionResult Action(int? x) // get MVC to bind null when no parameter is provided
{
    if(x.HasValue)
    {
        // do something
    }
}

OR

public ActionResult Action(int? x = null) // C# optional parameter (virtual overload)
{
    if(x.HasValue)
    {
        // do something
    }
}

Ответы [ 3 ]

29 голосов
/ 28 марта 2012

Я никогда не видел на практике вторую подпись действия и не вижу ее полезности.

Первый обычно охватывает все сценарии:

  • Если параметр не отправлен (GET /somecontroller/action), значение аргумента x будет нулевым внутри действия
  • Если передан параметр ax, но он не является действительным целым числом (GET /somecontroller/action?x=abc), значение аргумента x будет внутри элемента действия нулевым, а состояние модели будет недействительным
  • Если параметр axотправлено, и значение представляет собой допустимое целое число (GET /somecontroller/action?x=123), тогда ему будет присвоен х.

В моих примерах я использовал запросы GET с параметрами строки запроса, но, очевидно, то же самое относится и к другимHTTP-глаголы и если x был параметром маршрута.

7 голосов
/ 28 марта 2012

Вам нужно только указать необязательное значение параметра, если оно будет отличаться от null.

MVC3 автоматически установит null в качестве значения вашего параметра, если ничего не указано в перегрузке или в вызове Action.

Однако стоит отметить, что если после подписи этого параметра в подписи есть какие-либо необязательные параметры, то в вызове необходимо будет указать null.

Поэтому лучше поставить все необязательные параметры в конце подписи.

6 голосов
/ 29 марта 2012

Лучшее решение MVC для Asp.net - используйте селектор метода действия

Почему бы не упростить методы действия контроллера, удалив ненужную ветвь кода, и получить такой код, как показано здесь:

public ActionResult Index()
{
    // do something when there's no id
}

[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
    // do something when id is present
}

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

По моему мнению, это наилучшее возможное решение этой проблемы, потому что:

  1. Этоупрощает код, удаляя ненужную ветвь
  2. делает код проще в обслуживании (из-за меньшей сложности)
  3. расширяет инфраструктуру Asp.net MVC, насколько это возможно и нужно
  4. сохраняет типы параметров какони должны быть без необходимости делать их обнуляемыми
  5. и т. д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...