2013-11-29 5 views
10

Sto tentando di creare un EditorFor() per un elenco di un tipo complesso. Nello specifico le "Opzioni" qui sotto dovrebbero essere visualizzate in un unico ingresso multitext dove ogni opzione (stringa) si trova in una nuova riga. Tuttavia, posso visualizzare una sola opzione in una casella di testo e non tutte le opzioni ....EditorFor() per un elenco di tipo complesso (MVC)

My View per modello e Classe:

public class ItemViewModel 
{ 
    public int itemId { get; set; } 

    [UIHint("Option")] 
    public List<Option> Options { get; set; } 
} 
public class Option 
{ 
    public string Text { get; set; } 
} 

miei modelli Editor:

EditorTemplates \ Item.cshtml

@model ItemViewModel 
@Html.EditorFor(model => model.Options) 

EditorTemplates \ Option.cshtml

//Not sure how to dispay the options here 
<textarea rows="4" cols="50"> 
Display Options 
</textarea> 

Se aggiorno il mio EditorTemplates a:

EditorTemplates \ Item.cshtml

@model ItemViewModel 
@Html.EditorFor(model => model.Options[0]) 

EditorTemplates \ Option.cshtml

@Html.TextBoxFor(x => x.OptionText) 

visualizzerà la prima opzione in una casella di testo. Ma, ancora una volta quello che sto cercando di ottenere è di visualizzare tutte le opzioni in un ingresso multitext.

Qualche idea?

risposta

12

Quasi ce l'hai.

In questo EditorTemplates\Option.cshtml aggiungere la seguente:

@model IEnumerable<Option> 
@foreach(var option in Model) 
{ 
    @Html.TextBoxFor(m => option.Text) 
} 

Poi chiamare a suo avviso in questo modo:

@Html.EditorFor(model => model.Options) 

Se non si sta popolando le opzioni sul get iniziale, è necessario aggiungi questo nella tua classe ItemViewModel:

public class ItemViewModel 
{ 
    public ItemViewModel() 
    { 
     Options = new List<Option>(); 
    } 
    public int itemId { get; set; } 

    [UIHint("Option")] 
    public List<Option> Options { get; set; } 
} 

Questo costruttore initi Alizes la collezione:

public ItemViewModel() 
{ 
    Options = new List<Options>(); 
} 
+0

Ottengo "Riferimento oggetto non impostato su un'istanza di un oggetto". perché Model è null. – piris

+0

È necessario inserire il riferimento del modello nella vista in alto, ovvero @model ItemViewModel – hutchonoid

+0

Non sono sicuro di aver capito ... La mia vista option.cshtml ha il modello IEnumerable

-3

Utilizzando @hutchonoid risposta 's, è necessario chiamare il modello nella vista:

@Html.EditorFor(model => Model.Options) 

invece di

@Html.EditorFor(model => model.Options) 

e vi prego di notare, il Il modello Option.cshtml è in Views\Item\EditorTemplates\Option.cshtml o View\Shared\EditorTemplates\Option.cshtml

+2

No, non vuoi usare la proprietà Model, si vuole dare a MVC un'espressione da cui sarà in grado di determinare il percorso delle proprietà per associare il modello di vista. – billy

12

basta creare una vista in Shared/EditorTemplates/Option.cshtml

@model Option 

@Html.TextBoxFor(m => m.Text) 

e chiamare

@Html.EditorFor(model => model.Options) 

itera EditorFor oltre la raccolta per voi.

+2

Questo ha funzionato per me. Grazie! – AndeeC

0

Mi sono imbattuto nello stesso problema e ho una soluzione diversa ma un po 'simile con hutchonoid.

Quindi la prima parte è lo stesso, modificare l'Option.cshtml come segue:

@model IEnumerable<Option> 
@foreach(var option in Model) 
{ 
    @Html.TextBoxFor(m => option.Text) 
} 

E in Item.cshtml, che io chiamo l'Option.cshtml utilizzando Html.Partial, come segue:

@Html.Partial("Option", model:Model.Options) 

E nel mio caso, non devo modificare la classe ItemViewModel. Speriamo che questa possa essere una risposta alternativa a questo problema. Cheers!