2012-08-27 13 views
7

Ho un IEnumerable contenente le stringhe, utilizzando dati annotazioni per la convalida:Utilizzando EditorFor con IEnumerable <string> in MVC 3

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

Sto quindi utilizzando questo con un editor di modelli. Questo è come io lo chiamo a mio avviso:

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

Infine, il mio modello prende questo IEnumarable e crea un certo numero di elementi del modulo per ogni elemento:

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

Anche se gli elementi del modulo rendano correttamente , mi sto avvicinando correttamente? Inoltre, ho notato che non convalida più. Come posso risolvere questo?

risposta

7

Stai andando su di esso in un modo "corretto". (Giusto in quanto può funzionare, l'ho già fatto prima) Ma con la convalida il motivo per cui penso che non funziona è questo, hai la convalida su IEnemerable e non sulla stringa. Per ottenere la convalida su ogni stringa. Si dovrà creare un nuovo oggetto modello di dire

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

E poi dove si ha public IEnumerable<string> MyList { get; set; } sostituirlo con public IEnumerable<LabelString> MyList { get; set; }

Questo dovrebbe dare la convalida su ciascuna delle etichette nel ciclo for.

3

Non è una matematica, quindi c'è più di una soluzione al tuo problema e non ce n'è uno giusto.

Detto questo, però, preferirei avvicino in modo diverso:

public class StringsViewModel 
{ 
    IEnumerable<string> myList; 
} 

Nella visualizzazione è necessario quindi

@model StringsViewModel 
@EditorForModel() 

Sarà convalidare perché ora hanno fortemente tipizzato modello piuttosto che generico. Inoltre, si salva sul ciclo foreach che è fatto automaticamente per te dal framework ...

Spero che questo aiuti.

Problemi correlati