2012-08-27 5 views
7

Ich habe ein IEnumerable Zeichenketten enthalten, für die Validierung Daten Anmerkungen mit:Mit EditorFor mit IEnumerable <string> in MVC 3

[Required(ErrorMessage = "This is required.")] 
[Remote("IsValid", "ControllerName")] 
public IEnumerable<string> MyList { get; set; }  

Ich verwende diese dann mit einem Editor-Vorlage. Dies ist, wie ich es in meiner Sicht nennen:

@Html.EditorFor(m => m.MyList) 

Schließlich meine Vorlage nimmt diese IEnumarable und erstellt eine Reihe von Formelementen für jedes Element:

@model IEnumerable<string> 
@foreach (var str in Model) 
{ 
    <li> 
     @Html.LabelFor(m => str, "My Label") 
     @Html.TextBoxFor(m => str) 
     @Html.ValidationMessageFor(m => str) 
    </li> 
} 

Auch wenn die Formelemente richtig tun render , nähere ich mich dem richtig? Außerdem habe ich festgestellt, dass es nicht mehr validiert. Wie kann ich das beheben?

Antwort

7

Sie gehen "richtig" vor. (Korrekt, dass es funktionieren kann, ich habe das schon vorher getan) Aber mit der Validierung ist der Grund, warum ich denke, dass es nicht funktioniert, dass Sie die Validierung auf dem IEnemerable haben und nicht auf der Zeichenkette. Um Validierung für jede Zeichenfolge zu erhalten. Sie müssten ein neues Modell Objekt sagen

public class LabelString 
{ 
    [Required(ErrorMessage = "This is required.")] 
    public string labelName { get; set; } 
} 

erstellen und dann, wo Sie public IEnumerable<string> MyList { get; set; } es haben ersetzen mit public IEnumerable<LabelString> MyList { get; set; }

Dass Sie Validierung auf jedem der Etiketten in der for-Schleife geben sollte.

3

Es ist keine Mathematik, so gibt es mehr als 1 Lösung für Ihr Problem und gibt es keine richtige.

Sagte, dass ich aber eher es anders angehen würde:

public class StringsViewModel 
{ 
    IEnumerable<string> myList; 
} 

In der Ansicht werden Sie dann brauchen

@model StringsViewModel 
@EditorForModel() 

Es wird validieren, weil Sie jetzt Modell stark typisiert haben eher als Generika. Sie sparen auch auf die foreach Schleife, die für Sie automatisch durch das Framework ...

Hope dies hilft.

Verwandte Themen