编辑:添加赏金,因为我正在寻找一个MVC3的解决方案(如果存在)除此以外:为什么ASP.NET MVC在数据绑定期间关心我的只读属性?
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = FALSE;
我对我的'地址'模型'CityStateZip'
有只读属性。
这只是一个从美国地址获得城市,州,邮编的便捷方式。如果该国不是美国的话,它会引发异常(呼叫方应该首先检查)。
public string CityStateZip
{
get
{
if (IsUSA == false)
{
throw new ApplicationException("CityStateZip not valid for international addresses!");
}
return (City + ", " + StateCd + " " + ZipOrPostal).Trim().Trim(new char[] {','});
}
}
这是我的模型的一部分,所以它被绑定。在ASP.NET MVC2 RC2之前,此字段在数据绑定过程中从未造成任何问题。我从来没有真正想过 - 毕竟它只是只读。
现在尽管2010年1月发布的RC2版本在数据绑定过程中给了我一个错误 - 因为默认模型绑定器似乎要检查此值(即使它是只读的)。
这是导致此错误被触发的'base.OnModelUpdated'行。
public class AddressModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
最后时刻变化的ModelBinder的明显造成的这种行为改变 - 但我不能肯定什么还没有它的repurcussions是 - 或者是否这是不是一个错误?我将此传递给MVC团队,但好奇的是,如果其他人有任何建议,同时我可以如何防止此属性的约束力。
这篇文章非常值得关于这些改变 - 但没有提及只读属性(不是我期望的)。这个问题(如果有的话)可能比这种情况更广泛 - 我只是不确定任何反弹 - 如果有的话!
Input Validation vs. Model Validation in ASP.NET MVC
按照要求通过这里@haacked的堆栈跟踪:
我通过简单地添加以下行任何模型和制作后,以相应的操作方法来获取此。在这个例子中,我将它添加到了我最简单的模型中。
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException:属性访问 '富' 上对象 'Rolling_Razor_MVC.Models.ContactUsModel' 发生以下异常: '栏'] System.ComponentModel.ReflectPropertyDescriptor.GetValue(对象成分)+ 390 System.Web.Mvc。 < > c__DisplayClassb。 <GetPropertyValueAccessor> b__a()18 System.Web.Mvc.ModelMetadata.get_Model()22 System.Web.Mvc.ModelMetadata.get_RealModelType()29 System.Web.Mvc。 <GetValidatorsImpl> d__0.MoveNext()+38 System.Linq。 <SelectManyIterator> d__14`2.MoveNext()+273 System.Web.Mvc。 <验证> d__5。的MoveNext()644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext,ModelBindingContext的BindingContext)92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext,ModelBindingContext的BindingContext,对象模型)60 的System.Web .Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext,ModelBindingContext bindingContext)+1048 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)+280 System.Web.Mvc.Controller.TryUpdateModel(TModel model,String prefix ,String [] includeProperties,String [] excludeProperties,IValueProvider valueProvider)+449 System.Web.Mvc.Controller.TryUpdateModel(TModel model)+73
是什么你看到的确切错误?查看相关的控制器和视图代码也很有帮助。 – 2010-02-06 03:19:54
我们需要更多的细节,但是当我们尝试读取导致异常被抛出的属性时,我的猜测是IsUsa是错误的。不知道为什么我们会在模型绑定期间阅读它,除非在表单中有一个名为“CityStateZip”的表单域。 – Haacked 2010-02-06 03:52:06
@brad以及确切的错误是'CityStateZip对国际地址无效!' ;-) 我使用完整的堆栈跟踪来更新问题。 复制只需将此添加到任何现有的模型,并对相应的actionmethod进行POST: public string Foo {get {throw new Exception(“bar”); }} – 2010-02-06 03:54:46