編集:これ以外のMVC3ソリューション(存在する場合)を探しているため、報奨金を追加しました:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
'Address'モデルに読み取り専用プロパティがあります'CityStateZip'
。
これは、米国の住所から都市、州、zipを取得するための便利な方法です。国が米国でない場合は例外がスローされます(発信者が最初にチェックすることになっています)。
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);
モデルバインダーへの直前の変更により、明らかにこの動作の変更が発生しましたが、その結果が何であるか、またはこれがバグであるかどうかはまだよくわかりません。私はこれをMVCチームに渡しますが、その間に他の誰かがこのプロパティのバインドを防ぐ方法について何か提案があれば興味があります。
この記事は変更について読む価値がありますが、読み取り専用プロパティについてはまったく触れていません(私が期待していることではありません)。問題(ある場合)は、この状況よりも広範囲である可能性があります-もしあれば、逆効果についてはよくわかりません!
@haackedによって要求されたように、ここにスタックトレースがあります:
これは、任意のモデルに次の行を追加し、対応するアクションメソッドに投稿するだけで取得できます。この例では、可能な限り単純なモデルに追加しました。
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException:オブジェクト'Rolling_Razor_MVC.Models.ContactUsModel'のプロパティアクセサー'Foo'が次の例外をスローしました:'bar'] System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component)+390System.Web.Mvc。<>c__DisplayClassb。<GetPropertyValueAccessor>b__a()+18 System.Web.Mvc.ModelMetadata.get_Model()+22System.Web.Mvc。 ModelMetadata.get_RealModelType()+29System.Web.Mvc。<GetValidatorsImpl>d__0.MoveNext()+38System.Linq。<SelectManyIterator>d__14`2.MoveNext()+273System.Web.Mvc。<Validate>d__5。 MoveNext()+644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext、ModelBindingContext bindingContext)+92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext、ModelBindingContext bindingContext、Object model)+60System.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 [] extractProperties、IValueProvider valueProvider)+449 System.Web.Mvc.Controller.TryUpdateModel(TModelモデル)+73