ASP.NET MVC-Альтернатива для [Bind(Exclude = " Id")]
есть ли альтернатива для [Bind(Exclude = "Id")]
(По Теме Вопрос) ?
могу ли я написать модель binder?
5 ответов
Да есть: это называется view models. Модели представления классов, которые специально адаптированы к конкретным потребностям данного вида.
Так вместо:
public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model)
использование:
public ActionResult Index(SomeViewModel viewModel)
где модель представления содержит только свойства, которые должны быть связаны. Затем вы можете сопоставить между моделью вида и моделью. Это сопоставление можно упростить с помощью AutoMapper.
как лучшая практика я бы рекомендовал вам всегда использовать модели представления и представления.
очень простое решение, которое я придумал.
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;
}
}
}
или
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("ID", "Prop2", "Prop3", "Etc");