Frage

Ich versuche DataAnnotations zu verwenden Validierung meiner Modelle in asp.NET MVC 2 RC2 hinzufügen, mit TryUpdateModel

        var user = UserManager.Find(id);

        this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());

Das aktualisiert das Modell, aber die Validierung wird nie aufgerufen. Ich habe versucht, TryUpdateModel als auch mit (was die direkte Art der Benutzer ist), nicht die Form Wert Provider, mit ProvisioningObject direkt (die die Validierung von Metadaten hat), ohne Erfolg.

Googeln für Beispiele gibt mir nur Wege DataAnnotations zu verwenden, indem durch eine Parameterbindung

public ActionResult Update(User user)

Was ich für Update-Szenarien nicht mögen.

Alle Tipps und / oder Lösungen?

Bearbeiten Meine Objekte sind automatisch generierten Objekte aus einem WCF-Dienst.

Ich habe partials der Lage sein, DataAnnotations hinzuzufügen. Ich nenne TryUpdateModel dreimal, weil es offenbar keine Vererbung unterstützt, was ich denke, auch mit DataAnnotations mein Problem ist. I geben die Validierung Attribute für ProvisioningObject und die Bindung nicht für vererbte Zeug sieht so.

[MetadataType(typeof(ProvisioningObjectMetadata))]
public partial class ProvisioningObject : IProvisioningObject
{
    public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } }
}


[MetadataType(typeof(UserMetadata))]
public partial class User : IUser
{
}


public class ProvisioningObjectMetadata
{
    [DisplayName("Country")]
    public string CountryIsoCode { get; set; }

    [Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")]
    [TempValidator]
    public string DisplayName { get; set; }
}


public class UserMetadata
{
    [DisplayName("Username")]
    public string Name { get; set; }
}


// Controller action
    public ActionResult Update(string id, FormCollection form)
    {
        var user = UserManager.Find(id);

        this.TryUpdateModel<IUser>(user.User, form.ToValueProvider());
        this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider());
        this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider());

        if (ModelState.IsValid) // always true
        {
            return Redirect;
        }
        else
        {
            return View();
        }
    }

Wenn ich die Metadaten für Display in UserMetadata hinzufügen, es funktioniert wie erwartet, aber das scheint für nichts sehr überflüssig. Und es würde bedeuten, ich würde auch kopieren müssen / paste alle meine ererbten Schnittstellen so TryUpdateModel entsprechend verhält.

Ich glaube, ich bin nach einem Weg suchen, die mich nicht benötigen, zu kopieren und zu geerbten Klassen meiner Validierungsattribute.

War es hilfreich?

Lösung

New Antwort:

"Meine Objekte sind automatisch generierten Objekte aus einem WCF-Dienst."

Automatisch generiert Objekte werden keine Attribute auf sie haben. Erhalten Sie Ihre Objekte und deren Attribute auf der Server-Seite oder auf der Client-Seite definieren?

Alte Antwort: Wenn Ihre Metadaten nicht auf IProvisioningObject ist, dann wird keine Validierung aufgerufen werden. Das MVC2 Standardbinder Modell nur weiß, wie "extra" [MetadataType (buddyClass)] Validierungsinformationen zu finden.

Für eine Update-Szenarien binden gegen DTOs und dann die DTOs Karte, wenn IsValid (), um Ihre wichtigsten Modellklassen.

Andere Tipps

Implementieren IDataErrorInfo Schnittstelle in Ihrer Teilklasse Sie müssen benutzerdefinierte Validierung für jedes Feld schreiben (in dem Sie Daten Annotation-Klasse verwenden können jede gewünschte Eigenschaft zur Validierung)

Wenn Sie Code Beispiel müssen dann lass es mich wissen. Ich werde es für Sie schreiben!

Quelle: http: // www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx

Wie wissen Sie, dass die Validierung nicht genannt wird? Sind Sie ModelState.IsValid in Ihren Update-Controller überprüft und festgestellt, dass es irrtümlich kommt zurück wahr?

Ein typisches Update Muster:

UpdateModel(model);
if(!ModelState.IsValid) return View(model);
return RedirectToAction("Index");

Wenn Sie etwas „IsValid“ auf Ihrem Modell erwarten automatisch aufgerufen werden, das wird nicht passieren. Die Daten Anmerkungen arbeiten hinter den Kulissen mit dem Model Wörterbuch auf der Controller-Basisklasse.

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