Есть ли альтернатива для [Bind(Exclude = "Id")]
(Связанный вопрос)?
Могу ли я написать скоросшиватель моделей?
Есть ли альтернатива для [Bind(Exclude = "Id")]
(Связанный вопрос)?
Могу ли я написать скоросшиватель моделей?
Да, есть: это называется моделями просмотра. Модели представления - это классы, специально предназначенные для конкретных потребностей данного представления.
Так что вместо:
public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model)
использовать:
public ActionResult Index(SomeViewModel viewModel)
где модель представления содержит только те свойства, которые необходимо связать. Затем вы можете сопоставить модель вида и модель. Это сопоставление можно упростить с помощью AutoMapper.
В качестве наилучшей практики я бы порекомендовал вам всегда использовать модели представления в представление и из представления.
Вы можете исключить свойства напрямую с помощью атрибута, используя;
[BindNever]
Очень простое решение, в котором я разобрался.
public ActionResult Edit(Person person)
{
ModelState.Remove("Id"); // This will remove the key
if (ModelState.IsValid)
{
//Save Changes;
}
}
}
В дополнение к существующим ответам C # 6 позволяет более безопасным способом исключить свойство:
public ActionResult Edit(Person person)
{
ModelState.Remove(nameof(Person.Id));
if (ModelState.IsValid)
{
//Save Changes;
}
}
}
or
public ActionResult Index([Bind(Exclude = nameof(SomeDomainModel.Id))] SomeDomainModel model)
Как заявил Десмонд, я считаю, что remove очень прост в использовании, также я сделал простое расширение, которое может пригодиться для игнорирования нескольких реквизитов ...
/// <summary>
/// Excludes the list of model properties from model validation.
/// </summary>
/// <param name="ModelState">The model state dictionary which holds the state of model data being interpreted.</param>
/// <param name="modelProperties">A string array of delimited string property names of the model to be excluded from the model state validation.</param>
public static void Remove(this ModelStateDictionary ModelState, params string[] modelProperties)
{
foreach (var prop in modelProperties)
ModelState.Remove(prop);
}
Вы можете использовать это в своем методе действий следующим образом:
ModelState.Remove(nameof(obj.ID), nameof(obj.Prop2), nameof(obj.Prop3), nameof(obj.Etc));