Вы компилировали для выпуска кода? Я думаю, что хороший компилятор обнаруживает в Вашем втором примере, что строка никогда не используется удалять весь цикл.
Вам не хватает раздела «Безопасность привязки модели». Вы всегда должны включать белый список свойств, которые могут быть обновлены любым из ваших пользовательских методов ввода.
Например, из NerdDinner:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Include="Title, Address")] Dinner dinner)
{
}
или если вы вызываете UpdateModel, вы можете создать строковый массив разрешенных свойств, и выполните
UpdateModel(myObject, allowedProperties);
Вы можете заблокировать сами классы, чтобы можно было обновлять только определенные свойства.
[Bind(Include="MyProp1,MyProp2,MyProp3")]
public partial class MyEntity { }
Ваши опасения верны. Это называется массовым присвоением. Вы можете защитить свой код, пометив свой класс с помощью BindAttribute и установив Exclude / Include properties.
Кто-то предприимчивый или злонамеренный может сопоставить поля с любым из свойств вашей модели. Есть несколько способов обойти это
. Самый простой - использовать перегрузку свойств exclude / include UpdateModel, как упоминалось ранее. Обратной стороной этого является то, что метод принимает только массив строк, что иногда может означать, что ваш код выходит из синхронизации, если вы выполняете какое-либо переименование.
Другой способ - использовать простой DTO, который содержит связанные поля, затем вы можете взять DTO и делайте то, что вы хотите, с вашим объектом события, это, очевидно, добавляет еще один класс и гораздо более ручное, но дает вам гораздо больше контроля
public ActionResult(int id, EditForm form) {
MyEvent event = _eventRepository.GetMyEvent(id);
event.Name = form.Name; //etc;
if (User.IsInRole("Organiser")) {
event.Date = form.Date;
}
return ...
}
Другой способ может заключаться в привязке модели клиента для вашего класса MyEvent, который связывает только желаемое поле, вероятно, излишек.
Есть перегрузки UpdateModel , которые принимают массив строк с именами свойства для обновления. Эти перегрузки будут обновлять только названные свойства.
Могут быть другие более простые / декларативные способы сделать это, я не эксперт по привязке данных MVC.
Вы можете пометить поля в своей модели, которые следует игнорировать при обновлении, или передать список включенных / исключенных полей, используя одну из других перегрузок UpdateModel .