2011-11-22 8 views
7

ho uno strano problema riguardante l'editor per l'helper di MVC3. Ecco la cosa: sto cercando di visualizzare una checkboxList e funziona se non chiamassi esplicitamente il nome del template. Tuttavia, se provo a utilizzare il nome del modello, esso genera un'eccezione dicendo che sto cercando di passare una lista generica quando dovrei semplicemente passare il mio viewModel. Vi mostrerò il codice per renderlo più comprensibile:asp.net-mvc3 Editor Per il problema del nome modello

ViewModel

public class ChkViewModel 
{ 
    public string ContractName {get;set;} 
    public string Contract {get;set;} 
    public bool Checked {get;set;} 
} 

Il Template EditorFor (si chiama ContractTemplate)

@model Models.ChkViewModel 
<p> 
    @Html.HiddenFor(x => x.Contract) 
    @Html.LabelFor(x => x.ContractName , Model.ContractName) 
    @Html.CheckBoxFor(x => x.Checked, new { @class = "chkContract" }) 
&nbsp;  
</p> 

Estratto dal mio punto di vista

<div id="contractContainer"> 
    @Html.EditorFor(item=>item.ContractList) 
</div> 

Funziona bene. Ma provate a fare questo:

<div id="contractContainer"> 
    @Html.EditorFor(item=>item.ContractList, "ContractTemplate") 
</div> 

Si getta il InvalidOperationException dicendo che devo passare una semplice ChkViewModel e non un GenericList ChkViewModel.

Sto solo chiedendo questo perché ho provato a creare un altro checkbox e non sono riuscito a farlo funzionare (nemmeno visualizzare le caselle di controllo) e quando ho provato a impostare il nome del modello, in modo che potessi almeno vedere le caselle di controllo, ha generato quell'errore.

+0

perché si desidera specificare il nome del modello? – epzee

+0

Come ho detto nell'ultimo paragrafo, non ne avevo bisogno prima ma quando ho provato a creare un altro esempio, non ha funzionato. Inoltre, se è un parametro, perché non dovrebbe usarlo? Non sarebbe meglio sapere quale template sto usando, in particolare? – AdrianoRR

risposta

6

Il messaggio di errore è corretto, se si desidera utilizzare il nome del modello che dovrebbe essere così:

<div id="contractContainer"> 
    @for (int i = 0; i < item.ContractList.Count; i++) { 
     @Html.EditorFor(item => item.ContractList[i], "ContractTemplate") 
    } 
</div> 

Questo è simile a quello che sta ASP.NET MVC facendo dietro le quinte per voi nel primo caso (itera sulla raccolta e chiama il modello).

+2

Ehi, grazie Thomas, ha funzionato. Ma perché il mio primo esempio ha funzionato correttamente quando non ho passato il nome del modello? è praticamente la stessa checkboxlist. Non riesco ancora a capire cosa fa il mvc dietro le quinte. A proposito, spero che continui a migliorare il tuo aiutante jqGrid. – AdrianoRR