Что такое корректное поведение UpdateModel в ASP.NET MVC?

При использовании Linq можно использовать ToList () дополнительный метод

Dim strings As List<string> = string_variable.Split().ToList<string>();
17
задан Community 23 May 2017 в 11:48
поделиться

4 ответа

Поведение, которое вы испытываете с UpdateModel () звучит так, как будто вы привязываетесь к списку, и в этом случае UpdateModel () удалит содержимое списка и повторно заполнит его. См. блог Хансельмана для обсуждения этого. Если вы обновляете отдельный объект, UpdateModel () обновит этот отдельный объект, оставив свойства, которые не имеют соответствующего значения формы, как есть.

Многие из этих проблем сводятся к тому, что UpdateModel () действительно подразумевается для повторного заполнения моделей представления, а не моделей предметной области, на основе ввода формы. (Я немного упрощаю ситуацию, говоря, что модель представления - это просто контракт между контроллером и представлением, в то время как ваша модель предметной области может быть объектом модели LINQ2SQL или EF.) Все учебные пособия и демонстрации MVC показывают, что UpdateModel () используется против объектов базы данных, что я считаю неудачным, поскольку это несколько вводит в заблуждение относительно предполагаемой цели привязки модели. Сообщение Роберта больше указывает на истинное предназначение UpdateModel ().

15
ответ дан 30 November 2019 в 13:21
поделиться

Я довольно успешно использую UpdateModel для типов, не являющихся списками. Я всегда стараюсь указывать массив includeProperties (не из-за возможности возникновения этой проблемы, а из соображений безопасности - хотите ли вы, чтобы пользователь мог взломать форму (очень просто), отправить даты и т. Д.?).

Это не значит, что его нельзя улучшить.

Кроме того, практический момент, который следует иметь в виду при установке требований: для веб-сервера, получающего POST, пустое поле - это то же самое, что и не -существующее поле . Это означает, что если UpdateModel был спроектирован таким образом, что он не «сбрасывал» несуществующие поля формы (например, дату), такое же поведение означало бы, что если пользователь удалит текст в вашем поле даты и публикации, он не будет обновляться. с пустым (или нулевым).

Джеймс

2
ответ дан 30 November 2019 в 13:21
поделиться

Я считаю, что вы правы относительно поведения UpdateModel.

Однако ASP.NET MVC следует модели «туда и обратно», что означает, что ваша форма уже должна содержать все поля ему необходимо произвести полную запись, либо потому, что вы поместили значения для всех полей в представление, либо потому, что вы запрашиваете все поля у пользователя.

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

5
ответ дан 30 November 2019 в 13:21
поделиться

Но мне все еще не удается представляя всю мою объектную модель в форма, особенно если сказать, что у меня было 2 дочерние объекты и пара списков, Я не уверен, как это легко может быть нанесен на карту; Стек скрытых поля, отображающие весь объект карта? Это кажется странным.

Для этого вам нужно изучить такие вещи, как SubControllers и RenderAction. Вы можете их погуглить. Я много использую RenderAction. Это позволяет мне вставлять виджет на страницу из его собственного метода контроллера, без необходимости вставлять отдельные данные в ViewData.

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

Вы правы насчет этого. Такие вещи, как CreationDate, UpdatedBy должны обрабатываться в Контроллере (на самом деле репозиторий, если вы используете репозитории). К тому времени у вас уже должны быть все поля, необходимые из модели представления для обновления вашей базы данных.

Возможно, вам потребуется использовать объекты «строго типизированной модели представления». Если вы не знаете или не уверены, просмотрите эту страницу: http://nerddinnerbook.s3.amazonaws.com/Part6.htm

2
ответ дан 30 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: