2012-03-16 13 views
5

Tengo un modelo que se ve algo como esto:¿Cómo puedo vincularme a una lista como propiedad en un modelo en MVC 3 Razor?

public class EditUserViewModel 
    { 
     public EditUserViewModel() 
     { 

     } 
     public EditUserDataModel User { get; set; } 
    } 

con un objeto respaldo que tiene este aspecto:

public class EditUserDataModel 
{ 
    public EditUserDataModel() 
    { 
     Roles = new List<UserRoleListDataModel>(); 
    } 
    [DisplayName("First Name")] 
    public string FirstName { get; set; } 
    [DisplayName("Last Name")] 
    public string LastName { get; set; } 
    [DisplayName("Full Name")] 
    public string FullName { get { return FirstName + " " + LastName; } } 
    public List<UserRoleListDataModel> Roles { get; set; } 
} 

Y UserRoleListDataModel se ve así:

public class UserRoleListDataModel 
{ 
    public Guid Id { get; set; } 
    public string RoleName { get; set; } 
    public bool UserIsInRole { get; set; } 
} 

Luego, en mi archivo Razor, estoy usando todo el asunto así:

@foreach (var role in Model.User.Roles) 
{ 
<tr> 
    <td>@role.RoleName</td> 
    <td>@Html.CheckBoxFor(x=>role.UserIsInRole)</td> 
</tr> 
} 

El problema que tengo es que cuando presento el formulario y pulso la acción de mi controlador, la lista Roles no se rellena en mi nuevo modelo.

Esto es lo que la acción de envío en el controlador parece:

public ActionResult EditUser(EditUserViewModel model) // model.User.Roles is empty. 
{ 
    // Do some stuff... 
    return RedirectToAction("UserList"); 
} 

Alguien tiene alguna sugerencia?

+1

https://github.com/danludwig/BeginCollectionItem y http://nuget.org/packages/BeginCollectionItem – danludwig

Respuesta

6

probar esto en su maquinilla de afeitar:

@for (int i=0;i < Model.User.Roles.Count;i++) 
{ 
@Html.Hidden("User.Roles.Index",i); 
<tr> 
    <td>@role.RoleName</td> 
    <td>@Html.CheckBox("User.Roles[" + i + "].UserIsInRole",role.UserIsInRole)</td> 
</tr> 
} 

Es algo manual, pero debe hacer el trabajo.

8

Cris Carew estaba cerca, y me puso en el camino correcto.

@for (int i=0;i < Model.User.Roles.Count;i++) 
{ 
    @Html.Hidden("User.Roles.Index", i) 
    @Html.HiddenFor(x => x.User.Roles[i].RoleName) 
    <tr> 
     <td>@Html.DisplayFor(x => Model.User.Roles[i].RoleName)</td> 
     <td>@Html.CheckBoxFor(x => Model.User.Roles[i].UserIsInRole)</td> 
    </tr> 
} 
+2

1 para el uso correcto de la sintaxis Razor para propiedades indizadas. Si bien Chris merece (y recibe) crédito, el suyo es la respuesta correcta y debe marcarse como tal. –

Cuestiones relacionadas