При связывании моделей MVC.NET должны ли страница представления модели и модель привязки быть одним и тем же классом? - PullRequest
0 голосов
/ 03 октября 2009

(то есть модель, которую вы передаете представлению, и модель, которую вы возвращаете после отправки формы.)

Если нет, то лучше так или иначе? Что делать, если есть данные, которые вы собираете, что выходит за рамки того, для чего у модели страницы представления есть свойство?

Ответы [ 2 ]

0 голосов
/ 03 октября 2009

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

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

Вот пример:

public ActionResult AddComment( 
    [Bind(Exclude = "commentId"] Comment userComment, bool notifyUser
)
{

     // do stuff to add comment to the DB
     // notifyUser is a checkbox passed from client, but isn't stored in DB        

     // now return the comment view to the client but that view needs the entire thread

     var model = GetThread();
     return View("Comment", model);
}
0 голосов
/ 03 октября 2009

Мне немного неясно этот вопрос, поэтому поправьте меня, если я ошибаюсь. Я предполагаю, что вы говорите о модели, которую вы передаете представлению, и модели, которую вы возвращаете после отправки формы.

Нет, они не обязательно должны быть одинаковыми, хотя, вероятно, у вас будет немного совпадений. Модель, подходящая к представлению, должна содержать все поля, которые будет заполнять Post, так как вам потребуется отправить данные обратно в случае ошибок проверки.

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

Если у вас есть дополнительные свойства в классе модели и вы используете автоматическое связывание в Post, у вас возникает проблема, когда, если кто-то изменяет запрос Post в пути и добавляет дополнительные данные, соответствующие неиспользуемым свойствам в модели, вы получите автоматическое связывание связывает те данные, которые в худшем случае могут быть использованы для чего-то вроде атаки SQL-инъекцией (в лучшем случае ваше приложение находится в неизвестном состоянии). Поэтому мой совет не делай этого. Если вам абсолютно необходимо, скажем, у вас есть поля, которые отображаются и скрываются на основе некоторых других элементов на странице, используйте ручное связывание и не связывайте поля, в которых не должно быть данных.

...