DefaultModelBinder в asp.net mvc

107
18 июня 2019, 10:30

Подскажите пожалуйста. Как правильно должна применяться привязка модели в mvc. Нашёл пример с mvc:

public ActionResult Create([Bind (Include="Name, Author")] Book b)
{
    // ...
}

То есть как я понимаю в action передаются только 2 параметра модели, Name и Author. Но я с таким же успехом могу написать:

public ActionResult Create(String Name, String Author)
{
    // ...
}

И так же передам 2 параметра. Подскажите пожалуйста в чём же разница?

Answer 1

И то и другое - полноправные подходы биндинга в asp.net, вы можете использовать любой в зависимости от обстоятельств.

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

public ActionResult Create(Book b)
{
}
public ActionResult Create(String name, String author)
{
}

Второй вариант хорошо смотрится в каком-то методе, который принимает на вход Id объекта и этого ему вполне достаточно для работы (например, страница детального просмотра Customer'а)

Но когда число параметров у функции возрастает до тёх то обычно советуют производить рефакторинг функции и вводить какой-либо класс -- эта рекомендация даже не из asp.net, а из общих правил рефакторинга.

Применительно к asp.net если у вас на контроллере экшены редактирования или создания элемента, например Create или Edit для Customer или книги -- то вам гораздо удобнее создать класс и биндить сразу класс целиком, так как у вас нет надобности писать одни и те же поля в нескольких разных местах и уж тем более при переименовании какого-нибудь из них можно поменять только сам класс.

Вот в принципе и вся разница, осталось только поговорить о Include и Exclude.

У вас могут быть какие-то дополнительные свойства модели, которые вы бы не хотели, чтобы могли инициализироваться из полей пришедшего запроса (вообще, пользовательским данным никогда доверять нельзя, их всегда нужно валидировать). Допустим, вы что-то читаете из базы - и чтобы избежать возможной установки биндером вы либо явно перечисляте что нужно incude'ить, либо явно перечисляете, что нужно exclude'ить.

Из опыта. Я, бывало отвлекался при добавлении нового свойства и забывал добавить его в include, а потом недоумевал, почему его нету. Так что сейчас я стал задумываться о том, что скорее готов использоавть exclude, так как я делаю отдельные модели для create/edit и не использую доменные -- вероятности меньше что-то напортачить.

А в букварях в основном рекомендуемый подход - через Include. Мне не нравится когда include прописывают прямо в методе - я на классе указываю, на случай чтобы не забыть в новом методе добавить. Обычно работает, ни разу ещё не было случая когда пришлось бы разный набор полей указывать, так как у меня просто будут в этом случае разные модели.

READ ALSO
Обратная совместимость в .NET CORE

Обратная совместимость в .NET CORE

Как я понял, многое вырезали изNET CORE в угоду кроссплатформенности

111
Получение Json из файлов и папок

Получение Json из файлов и папок

В папке music на хостинге лежал папки типа

115