2011-11-22 10 views
7

tengo un problema extraño con respecto al editor Para el ayudante de MVC3. Aquí está la cosa: estoy tratando de mostrar un checkboxList y funciona si no llamo explícitamente el nombre de la plantilla. Sin embargo, si trato de usar el nombre de la plantilla, arroja una excepción que dice que estoy tratando de pasar una lista genérica cuando simplemente debería pasar mi viewModel. Voy a mostrar algo de código para hacerlo más comprensible:asp.net-mvc3 Editor Para el problema del nombre de la plantilla

modelo de vista

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

La plantilla EditorFor (se llama 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> 

extracto de mi vista

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

Esto funciona bien. Pero tratar de hacer esto:

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

Se lanza el InvalidOperationException diciendo que tengo que pasar un ChkViewModel sencilla y no un ListaGenerica ChkViewModel.

Solo estoy pidiendo esto porque traté de crear otra checkboxlist y no pude hacer que funcionara (ni siquiera mostrar las casillas de verificación) y cuando traté de establecer el nombre de la plantilla, para que al menos pudiera mira las casillas de verificación, arrojó ese error.

+0

¿por qué quiere especificar el nombre de la plantilla? – epzee

+0

Como mencioné en el último párrafo, no lo necesitaba antes pero cuando traté de crear otro ejemplo, simplemente no funcionó. Además, si es un parámetro, ¿por qué no debería usarlo? ¿No sería mejor saber qué plantilla estoy usando, específicamente? – AdrianoRR

Respuesta

6

El mensaje de error es correcto, si usted desea utilizar su nombre de la plantilla que debe tener este aspecto:

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

Esto es similar a lo que está haciendo ASP.NET MVC detrás de las escenas para que en el primero caso (itera sobre la colección y llama a su plantilla).

+2

Oye, gracias Thomas, eso funcionó. Pero, ¿por qué mi primer ejemplo funcionó correctamente cuando no pasé el nombre de la plantilla? es básicamente la misma lista de casilla de verificación. Todavía no entiendo lo que mvc hace detrás de escena. Por cierto, espero que continúes mejorando tu ayudante jqGrid. – AdrianoRR

Cuestiones relacionadas