我有一个viewmodel,它是从MVC页面上的插入调用返回的。
它根据基础模型以及一些计算属性公开属性。
除非我运行if (tryupdateModel(viewModel))
,否则一切都很好。此时似乎计算出的属性会导致错误并且它不会传递if语句?
我可以在此属性上添加注释,以防止在tryupdate
中检查它吗?
或者我如何确定究竟是什么不允许它返回true?
答案 0 :(得分:0)
这取决于您执行验证的方式。如果使用数据注释,则需要删除计算属性上的任何属性。您还需要检查哪个属性验证失败。您可以在TryUpdateModel:
之后执行以下命令var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
这将为您提供错误列表及其相应的属性,并可能帮助您了解正在发生的事情以及验证失败的原因。
答案 1 :(得分:0)
我可以加上注释吗? 这个属性可以防止它 检查了tryupdate?
禁止更新特定属性的一种方法是使用:
TryUpdateModel(model, null, null, new [] {"SecretProperty"}); // Blacklist
TryUpdateModel(model, new [] {"Prop1", "Prop2", "etc"}); // Whitelist - recommended
另一种是实现自定义的ModelBinder,它反映了属性并忽略了那些不应更新的属性:
public class ApplicationModelBinder : DefaultModelBinder {
protected override PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) {
var allProps = GetTypeDescriptor(controllerContext, bindingContext).GetProperties();
var resulting = new PropertyDescriptorCollection(null);
//Filter out the props with no scaffolding set
foreach(PropertyDescriptor prop in allProps) {
if (ShouldIncludeProperty(bindingContext, prop))
resulting.Add(prop);
}
return resulting;
}
private static bool ShouldIncludeProperty(ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) {
var doNotScaffold = propertyDescriptor.Attributes.OfType<ScaffoldColumnAttribute>().Any(x => !x.Scaffold);
return !doNotScaffold;
}
}
然后,您可以将[ScaffoldColumn(false)]
应用于不可更新的属性。
我用这种方法。
我如何确定究竟是什么不允许它返回true?
调用TryUpdateModel
后,您可以检查控制器的ModelState
属性并找出错误的位置。