2011-11-22 17 views
7

Mam dziwny problem dotyczący edytora. Pomocnik z MVC3. Oto rzeczy: próbuję wyświetlić checkboxList i działa, jeśli nie wywołuję explicity nazwę szablonu. Jednak jeśli spróbuję użyć nazwy szablonu, zgłasza wyjątek mówiąc, że próbuję przekazać ogólną listę, kiedy powinienem po prostu przekazać mój viewModel. Pokażę jakiś kod, aby uczynić go bardziej zrozumiałe:asp.net-mvc3 EditorFor nazwa szablonu numer

ViewModel

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

EditorFor szablonu (to się nazywa 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> 

Wyciąg z moim zdaniem

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

To działa dobrze. Ale spróbuj to zrobić:

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

To rzuca InvalidOperationException mówiąc, że muszę zdać prosty ChkViewModel a nie GenericList ChkViewModel.

Pytam tylko o to, ponieważ próbowałem utworzyć kolejną listę wyboru i nie mogłem jej uruchomić (nawet nie wyświetlałem pól wyboru) i kiedy próbowałem ustawić nazwę szablonu, tak abym mógł przynajmniej zobacz pola wyboru, wyrzucił ten błąd.

+0

dlaczego chcesz podać nazwę szablonu? – epzee

+0

Jak wspomniałem w poprzednim paragrafie, nie potrzebowałem go wcześniej, ale kiedy próbowałem stworzyć inny przykład, to po prostu nie zadziałało. Poza tym, jeśli jest to parametr, dlaczego nie powinien go używać? Czy nie byłoby lepiej wiedzieć, którego szablonu używam, w szczególności? – AdrianoRR

Odpowiedz

6

Komunikat o błędzie jest poprawne, jeśli chcesz używać nazwy szablonu powinna wyglądać następująco:

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

Jest to podobne do tego, co ASP.NET MVC robi za kulisami dla Ciebie w pierwszym case (iteruje nad kolekcją i wywołuje swój szablon).

+2

Hej, dzięki Thomas, to zadziałało. Ale dlaczego mój pierwszy przykład zadziałał poprawnie, gdy nie podałem nazwy szablonu? to w zasadzie ta sama lista wyboru. Nadal nie rozumiem, co mVc robi za kulisami. Przy okazji, mam nadzieję, że nadal będziesz ulepszać pomocnika jqGrid. – AdrianoRR