Modellvalidierung mit enumerable Eigenschaften in Asp.net MVC2 RTM
-
21-09-2019 - |
Frage
Ich DataAnnotations
mit Attributen meine Modellobjekte zu validieren. Mein Modell Klasse sieht wie folgt aus:
public class MyModel
{
[Required]
public string Title { get; set; }
[Required(ErrorMessage = "At least one editor is required.")]
public List<User> Editors { get; set; }
}
public class User
{
public int Id { get; set; }
[Required]
public string FullName { get; set; }
[Required]
[DataType(DataType.Email)]
public string Email { get; set; }
}
Meine Controller-Aktion aussieht wie:
public ActionResult NewItem(MyModel data)
{
if (!this.Model.IsValid)
{
// invalid processing
}
// valid processing
}
Der Nutzer ist mit Blick präsentiert, die eine Form hat, mit:
- ein Textfeld mit Dummy-Namen in dem Benutzer Benutzer-Namen eingeben. Für jeden Benutzer sie eingeben, da ein Client-Skript ist mit Ajax gekoppelt, die einen
<input type="hidden" name="Editors[0].Id" value="userId" />
für jeden Benutzer (Aufzählung Index ist daher nicht immer 0, wie hier geschrieben), so Standardmodell Bindemittel in der Lage ist, zu konsumieren und binden Sie das Formular ohne Probleme eingegeben schafft. - ein Textfeld, in dem Benutzer den Titel eingeben
Da bin ich mit Asp.net MVC 2 RTM die Modellvalidierung hat statt der Eingabevalidierung ich weiß nicht, wie Validierungsfehler zu vermeiden. Und da Benutzer User.Id
bieten, die gesamte User
Objektinstanz überprüft wird. Welche stört mich nicht, wie lange ich weiß, wie andere Eigenschaften Validierung auszuschließen.
Die Sache ist, ich habe BindAttribute
auf meiner Controller-Aktion zu verwenden. Ich würde entweder ein weißes oder eine schwarze Liste von Eigenschaften zu bieten. Es ist immer eine bessere Praxis eine weiße Liste zu liefern. Es ist auch zukunftssicher.
Das Problem
Meine Form funktioniert gut, aber ich Validierungsfehler über Benutzer FullName
und Email
Eigenschaften, da sie nicht vorgesehen sind. Ich sollte auch nicht füttern sie an den Client (über Ajax, wenn der Benutzer Benutzerdaten eingibt), weil E-Mail persönliche Kontaktdaten und wird nicht geteilt zwischen den Nutzern.
Wenn es nur ein einzelner Benutzer Bezug auf MyModel
würde ich schreiben
[Bind(Include = "Title, Editor.Id")]
Aber ich eine Aufzählung von ihnen haben. Wie stelle ich Bind
weiße Liste mit meinem Modell?
Eine mögliche Lösung
Ich könnte eine separate Ansicht Modell für User
schaffen, nur um MyModel Objekte einzugeben. Ich würde Attribut tatsächliche Validierung setzen und omit Eigenschaften braucht mich nicht.
public class MyModelUser
{
[Required]
public int Id { get; set; }
}
Lösung
ich am Ende eines separate Ansicht Modell (wie beschrieben in Eine mögliche Lösung in meiner Frage), das vollständig validiert werden kann. Es ist eine Abhilfe und ich würde noch gerne wissen, wie es richtig zu machen.