2010-03-09 26 views
11

creo que esta pregunta se aplica a cualquiera de los "Para" ayudantes HTML, pero mi problema específico es el uso de CheckBoxFor ...Foreach en la propiedad IEnumerable y CheckBoxFor en ASP.Net MVC

que tienen un modelo que es de escriba IEnumerable, donde los derechos son simples POCO. Este modelo es en realidad una propiedad de un modelo más grande para el que creé un Editor de plantilla. Aquí está el cuadro más grande de mi modelo:

public class bigmodel 
{ 
    public string Title {get; set;} 
    public string Description {get; set;} 

    [UIHint("ListRights")] 
    public IEnumerable<rights> Rights {get;set;} 
} 

public class rights 
{ 
    public bool HasAccess {get; set;} 
    public string Description {get;set;} 
} 

creé una editortemplate llamada "ListRights" que utiliza mi punto de vista principal. Por ejemplo: <% = Html.EditorFor (m => m.Rights)%>.

En ListRights.ascx, quiero código como este:

<table> 
    <% foreach(rights access in Model) 
    { %> 
     <tr> 
     <td> 
      <%=Html.CheckBoxFor(access) %> 
     </td> 
     <td> 
      <%=access.Description %> 
     </td> 
     </tr> 
    <% } %> 
</table> 

Sé que la línea CheckBoxFor no funciona, pero yo quiero hacer algo que genera el mismo resultado, como si el acceso era una propiedad en el modelo.

En el ejemplo anterior, me gustaría que todo se autobind en la publicación.

he intentado falsificar la casilla de verificación con un código similar a este, pero no vinculación automática:

<table> 
    <% for(int i=0; i < Model.Count(); i++) 
    { %> 
     <tr> 
     <td> 
      <%=Html.CheckBox(string.Format("[{0}].HasAccess",i), Model.ElementAt(i).HasAccess)%> 
     </td> 
     <td> 
      <%=access.Description %> 
     </td> 
     </tr> 
    <% } %> 
</table> 

¿Alguna sugerencia?

Respuesta

5

he encontrado la respuesta mediante el uso de un blog de Steve Sanderson en http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

El uso de "Html.BeginCollectionItem" trabajaron en mi situación.

Creé una Plantilla de Editor para derechos (en mi ejemplo). Luego, agregó Steve's BeginCollectionItem a esa plantilla. Llamé a la plantilla usando Html.RenderPartial como se sugiere en el blog de Steve.

Quería usar Html.EditorFor (m => m.item), pero eso no funciona porque el artículo está en ForEach y no en el modelo. ¿Se podría utilizar EditorFor en este caso?

+0

no lo hago realmente obtener esta respuesta, ¿por qué pasar por todos estos problemas? – mare

+0

bien, después de pensar un poco más e ir al blog de Steven, veo lo que estás tratando de lograr. Las soluciones de Steve funcionan en este caso. Aunque no creo que la experiencia del usuario sea buena en este caso, editar varios elementos de esta manera y publicarlos de nuevo en el controlador de una vez. – mare

12

supongo que tenía problemas porque esto no funcionaba

<%=Html.CheckBoxFor(access) %> 

y esto tampoco funcionó

<%=Html.CheckBoxFor(access=>access.HasAccess) %> 

pero esto debería funcionar

<%=Html.CheckBoxFor(x=>access.HasAccess) %> 
+0

Gracias! ¡Esto me ha hecho la vida más fácil! – Craig

+0

Me salvas mucho dolor, amigo. Gracias –

+0

trabajado como un encanto ... gracias – shazia