Frage

Edit: Hinzugefügt Prämie, weil ich eine MVC3 Lösung bin auf der Suche (falls vorhanden) als dies:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;


Ich habe eine Nur-Lese-Eigenschaft auf meiner ‚Adresse‘ Modell 'CityStateZip'.

Es ist nur eine bequeme Möglichkeit, Stadt zu bekommen, Bundesland, Postleitzahl von einer US-Adresse. Es gibt eine Ausnahme aus, wenn das Land nicht USA ist (der Anrufer soll zuerst überprü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 ein Teil meines Modells, damit es gebunden wird. Vor ASP.NET MVC2 RC2 dieses Feld verursacht nie ein Problem bei der Datenbindung. Ich noch nie wirklich darüber nachdachte -. Schließlich ist es nur nur gelesen wird,

Nun aber mit dem RC2 Release Januar 2010 gibt es mir einen Fehler während der Datenbindung -. Becasue des Standardbinder Modell scheint zu wollen, um diesen Wert zu überprüfen (auch wenn es nur gelesen wird)

Es ist die ‚base.OnModelUpdated‘ Linie, die diesen Fehler verursacht ausgelöst werden.

public class AddressModelBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext, bindingContext);

Last-Minute-Änderungen an den Modelbinder verursachten offenbar diese Änderung im Verhalten - aber ich bin ich noch nicht ganz sicher, was die repurcussions davon sind - oder ob oder nicht, ist das ein Fehler? Ich bin vorbei dies auf das MVC-Team, aber neugierig, ob jemand irgendwelche Vorschläge in der Zwischenzeit hat, wie ich diese Eigenschaft aus der Bindung verhindern.

Dieser Artikel lohnt sich über die Veränderungen zu lesen - aber nicht erwähnt, Nur-Lese-Eigenschaften überhaupt (nicht, dass ich es erwarten). Das Problem (wenn vorhanden) kann als diese Situation weiter gefasst sein - ich bin nur nicht sicher über all repurcussions - falls vorhanden

Eingabevalidierung vs. Modellvalidierung in ASP.NET MVC


Wie verlangt von @haacked hier ist der Stacktrace:

ich dies einfach durch die folgende Zeile zu jedem Modell hinzugefügt und einen Beitrag zu der entsprechenden Aktionsmethode zu machen. In diesem Fall habe ich es meinem einfachst mögliche Modell.

 public string Foo { get { throw new Exception("bar"); } }
  

[TargetInvocationException: Eigenschaftenaccessor 'Foo' auf Objekt 'Rolling_Razor_MVC.Models.ContactUsModel' warf die folgende Ausnahme: 'bar']      System.ComponentModel.ReflectPropertyDescriptor.GetValue (Object-Komponente) +390      System.Web.Mvc. <> C__DisplayClassb. b__a () +18      System.Web.Mvc.ModelMetadata.get_Model () +22      System.Web.Mvc.ModelMetadata.get_RealModelType () +29      System.Web.Mvc. d__0.MoveNext () +38      System.Linq. d__14`2.MoveNext () +273      System.Web.Mvc. 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 (Controllercontroller, ModelBindingContext Binding) 1048      System.Web.Mvc.DefaultModelBinder.BindModel (Controllercontroller, ModelBindingContext Binding) +280      System.Web.Mvc.Controller.TryUpdateModel (TModel Modell, String prefix, String [] includeProperties, String [] excludeProperties, IValueProvider Valueprovider) 449      System.Web.Mvc.Controller.TryUpdateModel (TModel Modell) +73

War es hilfreich?

Lösung

Ich glaube, ich bin ein ähnliches Problem auftreten. Ich habe die Details geschrieben:

http://forums.asp.net/t/1523362.aspx


Bearbeiten : Antwort von MVC-Team (von oben URL):

Wir untersuchten diese und zu dem Schluss gekommen, dass das Validierungssystem wie erwartet verhalten. Da die Modellvalidierung Validierung über alle Eigenschaften zu laufen versucht man, und da Nicht-Nullable-Wertetyp Eigenschaften haben eine implizite [Erforderlich] Attribut, sind wir diese Eigenschaft zu validieren und ihre Getter in dem Prozess aufrufen. Wir verstehen, dass dies von V1 des Produkts eine Bruch Änderung ist, aber es ist notwendig, das neue Modell Validierungssystem richtig funktionieren zu machen.

Sie haben ein paar Optionen, dies zu umgehen. Jeder dieser sollte funktionieren:

  • Ändern Sie das Datum der Eigenschaft auf ein Verfahren anstelle einer Eigenschaft; Auf diese Weise wird es durch den MVC-Framework ignoriert werden.
  • Ändern Sie die Eigenschaft Typ Datetime? statt Datetime. Dadurch wird die implizite [Erforderlich] von dieser Eigenschaft.
  • Deaktivieren Sie die statische DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes Flagge. Dies entfernt die impliziten [Erforderlich] aus allen Nicht-Nullable-Wertetyp Eigenschaften applikationsweit. Wir denken in V3 des Produkts Hinzufügen eines Attributs, die uns signalisieren, wird „nicht daran binden, tun Sie es nicht bestätigen, nur so tun, dass diese Eigenschaft nicht existiert.“

Nochmals vielen Dank für den Bericht!

Andere Tipps

Immer noch das gleiche Problem mit MVC3.

Ich denke, der beste Weg ist, einfach dazu in global.asax (von SevenCentral Antwort):

 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Dies wird für alle von ihnen deaktivieren

Das sieht für die ganze Welt wie ein Bug zu mir. Ich kann nicht vollständig verstehen, warum die Modelbinder meine Lese brauchen nur Eigenschaften zu überprüfen (es kann einige Formalitäten, aber ich definitiv nicht verstehen, und bin nicht bereit, die Zeit damit zu verbringen, zu).

Ich habe folgendes Modell Meta Data Provider in meiner Lösung um das Problem zu erhalten

protected override CachedDataAnnotationsModelMetadata CreateMetadataPrototype(IEnumerable<Attribute> attributes, Type containerType, Type modelType, string propertyName)
{
    var metadata = base.CreateMetadataPrototype(attributes, containerType, modelType, propertyName);

    if (metadata.IsReadOnly)
    {
        metadata.IsRequired = false;
    }

    return metadata;
}

protected override CachedDataAnnotationsModelMetadata CreateMetadataFromPrototype(CachedDataAnnotationsModelMetadata prototype, Func<object> modelAccessor)
{
    var metadata = base.CreateMetadataFromPrototype(prototype, modelAccessor);

    if (prototype.IsReadOnly)
    {
        metadata.IsRequired = false;
    }

    return metadata;
}

Sie werden auch noch die folgenden Global.asax.cs

hinzufügen
protected void Application_Start()
{
    ModelMetadataProviders.Current = new RESModelMetadataProvider();
    ModelBinders.Binders.Add(typeof(SmartDate), new SmartDateModelBinder());

    ...
}

Natürlich denke ich, ich könnte CityStateZip konvertieren GetCityStateZip() aber dann kann ich nicht binden Sie es in so etwas wie Silverlight ganz so leicht. Dies könnte für eine temporäre Lösung arbeiten für jemand anderes dieses Problem auftritt.

Ich habe das exakt gleiche Problem !!

Für weitere Informationen über mein Problem, können Sie eine href besuchen <= "https://stackoverflow.com/questions/2766291/asp-net-mvc-2-0-unused-model-property-being-called- when-Posting-a-Produkt-to-the "> ASP.NET MVC 2.0 Nicht verwendetes Modell Eigentum genannt werden, wenn ein Produkt auf den Server veröffentlichen?

bedeutet das wir brauchen, um unsere Eigenschaften mit der Annahme programmieren, dass sie unerwartet genannt werden (vor Eigenschaften, die es hängt davon ab, eingerichtet sind / initialisierten usw.) ... wenn ja, bedeutet dies eine Änderung in unserer Programmierpraktik und ich möchte wissen, wie es weitergehen.

inzwischen, ich habe nur eine einfache ‚wenn‘ prüfen, ob das Problem befreit.

Ich habe ein ähnliches Problem, ein Feld, das ich nicht einen Fehler zu nicht erwarten, validiert wurde empfangen, wenn das Formular zurück an den Controller geschrieben. Nach einigen googeln, stieß ich auf http://codeblog.shawson.co.uk/mvc-strongly-typed-view-returns-a-null-model-on-post-back/ wo es wurde darauf hingewiesen, dass Namenskonflikte könnten Probleme verursachen.

Obwohl ich nicht glaube, meine Post-back variable Klasse Eigenschaftsnamen hatte in Konflikt, die Umbenennung der Eigenschaft Empfang der Fehler mein Problem gelöst.

Das gleiche Problem besteht nach wie vor in MVC 5.2.3, und es ist nicht einmal der Validierungscode das Problem verursacht. Die DefaultModelBinder ruft die Getter außerhalb seines Validierungscode selbst wenn sie schreibgeschützt sind Eigenschaften und auch wenn keine Anforderungsdaten an die Steuerung weitergegeben werden diese Eigenschaften entspricht.

Hier finden Sie eine ausführlichere Erklärung und meine volle Lösung hier: https://stackoverflow.com/a/54431404/10987278.

Ich bin nicht sicher, ob diese Lösung mit MVC Refactoring werden kann 3, zu arbeiten, aber hoffentlich kann es andere noch von der gleichen Ausgabe in der späteren Version von MVC Leiden helfen, die sie über diese Frage gestolpert wie ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top