編輯:添加賞金,因爲我正在尋找一個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