mvc modelbinding - PullRequest
       3

mvc modelbinding

1 голос
/ 14 января 2010

У меня есть действие Edit / view для моего объекта User, но я хочу, чтобы только несколько полей можно было редактировать.

Я настроил представление для привязки к объекту User и использую Html.EditorFor () для нескольких полей, которые я хочу редактировать.

Я заметил в своем объекте пользователя на сообщение:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditUser(Mynamespace.User user)
{ }

что только поля, которые я предоставил для управления .EditorFor (), на самом деле имеют какие-либо данные.
Я попытался использовать Html.Hidden (Model.ID) для одного из полей, которые я не хотел редактировать, но в новом объекте User, созданном из привязки модели, он пуст.

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 14 января 2010

Похоже, вы, вероятно, захотите начать думать об использовании модели представления, специфичной для формы / ввода, с которым вы имеете дело. Но в краткосрочной перспективе ....

Вместо этого можно связать параметр FormCollection и скопировать значения вручную, ИЛИ ...

вы можете использовать метод TryUpdateModel для заполнения этого существующего пользовательского объекта новыми данными.

Вот документация для TryUpdateModel: http://msdn.microsoft.com/en-us/library/dd470756.aspx

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

Вот пример:

public interface IUserEditableFields
{
   string Username {get;set;}
   string Email {get;set;} 
}

//... in the controller action

if(TryUpdateModel<IUserEditableFields>(user)) {
   //validation passed
   //only Username and Email were editable
}

Это хороший ресурс о том, как это сделать: http://css.dzone.com/news/aspnet-mvc-think-before-you-bi

1 голос
/ 14 января 2010

Ответ Бена в значительной степени правильный, так как ViewModel может быть более подходящим, и если не считать этого, можно использовать TryUpdateModel. Однако я добавляю, что в этом случае вместо того, чтобы требовать от доменного объекта реализации нового интерфейса, вы используете перегрузку TryUpdateModel<T>(T, string[]), которая позволяет вам вносить в белый список обновляемые свойства в строковом массиве по имени.

1 голос
/ 14 января 2010

Используете ли вы хелпер со строгим типом для скрытого поля или он точно такой же, как вы ввели. Если вы получили именно то, что напечатано, то имя скрытого поля - это значение идентификатора, а не имя свойства в модели (ID). Возможно, вы захотите изменить его на:

<%= Html.Hidden( "ID" ) %>

или (если используются строго типизированные помощники)

<%= Html.HiddenFor( m => m.ID ) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...