ASP.NET MVC 3 - лучшие практики для работы с моделью в представлении - PullRequest
5 голосов
/ 06 июля 2011

Я использую ASP.NET MVC 3 и у меня есть несколько страниц, на которых большая часть модели представления доступна только для чтения. Пример поля мог бы быть таким:

<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>

Затем у меня есть поле, в котором пользователь должен ввести какой-нибудь текст подтверждения, например:

@Html.LabelFor(model => model.Verification)
@Html.PasswordFor(model => model.Verification)

Когда пользователь отправляет форму и она попадает в мой контроллер, все поля ViewModel равны нулю, кроме поля Verification. Пока что я обошел это так, что у меня есть несколько полей HiddenFor, таких как:

@Html.HiddenFor(model => model.MyField)

Однако, это становится ужасно быстро. Есть ли лучший способ обработки модели в состоянии просмотра, чтобы во время POST отправки формы я мог получить все свои поля? Это важно в случае, если текст проверки не совпадает во время процедуры POST, и мне нужно вернуть модель представления без повторного извлечения ее из базы данных.

Спасибо за любые предложения.

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Нет лучшего способа обойти это без повторного извлечения значения из базы данных. Причина в том, что привязка модели MVC только смотрит на параметры GET или POST, чтобы связать MyField с моделью действия, и если параметры GET / POST не имеют значения MyField, тогда оно должно сохранять это свойство как null (как еще узнать, какое значение должно быть?)

Чтобы связыватель модели мог видеть ваше значение MyField, нужно передать его в параметрах GET / POST, и для этого вам нужно явно указать форме представления, чтобы передать значение через Html.HiddenFor(). У представления нет способа автоматически узнать, отправлять ли это свойство в параметрах post / get.

Однако одна идея, на которую вы можете обратить внимание, - это создать вспомогательный метод Razor (или Html), который принимает имя поля и выражение (x => x.MyField) и записывает для вас следующий вывод:

<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
@Html.HiddenFor(model => model.MyField)

Это означает, что вам нужно написать только одну строку кода (что-то вроде @Html.ShowReadOnlyField(x => x.MyField, "My Field") вместо этих 3 строк. Однако это также предполагает, что везде, где вы хотите это сделать, будет иметь одинаковую структуру div.

Редактировать : Просто помните о проблемах безопасности полей, доступных только для чтения, поскольку они не предназначены только для чтения. Лучше повторно извлечь эти данные из базы данных, если эти данные будет использоваться для чего-либо в контроллере, потому что, даже если он читается только в HTML-форме, пользователи все равно могут установить это значение на что угодно, манипулируя данными POST / GET.

0 голосов
/ 06 июля 2011

Пожалуйста, попробуйте сериализовать модель на странице, а затем сделать сообщение? Это должно решить проблему.

<%= Html.Serialize("User",Model) %>

[HttpPost]   
public ActionResult Register([DeserializeAttribute] User user, FormCollection userForm)
{

}
...