Edit: Hinzugefügt Prämie, weil ich eine MVC3 Lösung bin der Suche nach anderen als diese (falls vorhanden):Warum kümmert sich ASP.NET MVC um meine schreibgeschützten Eigenschaften während der Datenbindung?
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Ich habe eine Nur-Lese-Eigenschaft auf meinem ‚Adresse‘ Modell 'CityStateZip'
.
Es ist nur eine bequeme Möglichkeit, Stadt, Staat, PLZ von einer US-Adresse zu bekommen. Es wird eine Ausnahme ausgelöst, wenn das Land nicht USA ist (der Anrufer soll zuerst prüfen).
public string CityStateZip
{
get
{
if (IsUSA == false)
{
throw new ApplicationException("CityStateZip not valid for international addresses!");
}
return (City + ", " + StateCd + " " + ZipOrPostal).Trim().Trim(new char[] {','});
}
}
Dies ist Teil meines Modells, so dass es gebunden wird. Vor ASP.NET MVC2 RC2 verursachte dieses Feld während der Datenbindung nie ein Problem. Ich habe nie wirklich darüber nachgedacht - schließlich ist es nur lesbar.
Jetzt, mit der RC2-Version vom Januar 2010, gibt es einen Fehler beim Datenbinding - weil der Standardmodellbinder diesen Wert überprüfen möchte (obwohl er schreibgeschützt ist).
Es ist die Zeile 'base.OnModelUpdated', die zur Auslösung dieses Fehlers führt.
public class AddressModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
Last-Minute-Änderungen an den Modelbinder offenbar diese Änderung im Verhalten verursacht - aber ich bin ich noch nicht ganz sicher, was die repurcussions davon sind - oder ob dies ist ein Bug? Ich gebe das an das MVC-Team weiter, bin aber gespannt, ob jemand sonst in der Zwischenzeit irgendwelche Vorschläge hat, wie ich verhindern kann, dass diese Eigenschaft bindet.
Dieser Artikel ist es wert, über die Änderungen gelesen zu werden - erwähnt aber keine schreibgeschützten Eigenschaften (nicht, dass ich das erwarten würde). Das Problem (falls es eines gibt) kann breiter sein als diese Situation - ich bin mir nicht sicher, ob es irgendwelche Rückwirkungen gibt - wenn überhaupt!
Input Validation vs. Model Validation in ASP.NET MVC
Wie die stacktrace hier @haacked angefordert:
ich diese erhalten, indem einfach die folgende Zeile zu jedem Modell hinzugefügt und einen Beitrag zu der entsprechenden Aktionsmethode zu machen. In diesem Fall habe ich es meinem einfachsten möglichen Modell hinzugefügt.
public string Foo { get { throw new Exception("bar"); } }
[TargetInvocationException: Eigenschaftenaccessor 'Foo' auf dem Objekt 'Rolling_Razor_MVC.Models.ContactUsModel' warf die folgende Ausnahme: 'bar'] System.ComponentModel.ReflectPropertyDescriptor.GetValue (Object-Komponente) + 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. < Bestätigen Sie > d__5.Movenext() 644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated (Controllercontroller, ModelBindingContext Binding) +92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (Controllercontroller, ModelBindingContext Binding, Object Model) +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-Modell, String-Präfix , String [] includeProperties, Zeichenfolge [] excludeProperties, IValueProvider valueProvider) +449 System.Web.Mvc.Controller.TryUpdateModel (TModel-Modell) +73
Was Global.asax.cs folgendes hinzufügen müssen, um zu bekommen ist Der genaue Fehler, den Sie sehen? Es wäre auch hilfreich, den entsprechenden Controller und den Code zu sehen. –
Wir brauchen mehr Details, aber meine Vermutung ist IsUsa ist falsch, wenn wir versuchen, diese Eigenschaft zu lesen, wodurch eine Ausnahme ausgelöst wird. Nicht sicher, warum wir es während der Modellbindung lesen würden, außer es gibt ein Formularfeld namens "CityStateZip" in dem Formular, das gepostet wird. – Haacked
@brad der genaue Fehler ist 'CityStateZip nicht gültig für internationale Adressen!' ;-) Ich aktualisiere die Frage mit dem vollen Stack-Trace. zu duplizieren, fügen Sie dies einfach zu jedem bestehenden Modell, das Sie haben, und einen POST zu der entsprechenden Aktionsmethode: öffentlichen String Foo {get {neue Ausnahme werfen ("bar"); }} –