asp.net mvc tryupdate在自定义viewmodel上失败

时间:2011-04-04 05:18:58

标签: asp.net-mvc asp.net-mvc-3 viewmodel

我有一个viewmodel,它是从MVC页面上的插入调用返回的。

它根据基础模型以及一些计算属性公开属性。

除非我运行if (tryupdateModel(viewModel)),否则一切都很好。此时似乎计算出的属性会导致错误并且它不会传递if语句?

我可以在此属性上添加注释,以防止在tryupdate中检查它吗?

或者我如何确定究竟是什么不允许它返回true?

2 个答案:

答案 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属性并找出错误的位置。