有没有[Bind(Exclude="Id")]
的替代方案(相关问题)?
我能写一个模型绑定器吗?
是的,有一种方法:它被称为视图模型。视图模型是专门针对给定视图的特定需求而设计的类。
因此,不再需要:
public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model)
使用:
public ActionResult Index(SomeViewModel viewModel)
视图模型(View Model)只包含需要绑定的属性。然后您可以在视图模型和模型之间进行映射。使用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;
}
}
}
或者public ActionResult Index([Bind(Exclude = nameof(SomeDomainModel.Id))] SomeDomainModel model)
正如Desmond所说,我发现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));