2012-07-14 21 views
5

Ha habido muchas preguntas sobre esto ... pero de alguna manera no puedo hacer que este enlace funcione y todavía estoy Obteniendo valores nulos en mi Modelo de Vista publicado. Esta es MVC 4..NET MVC 4 Modelo de vista fuertemente tipado que contiene Modelo fuertemente tipado con EditorPedido y Vista preliminar de EditorTemplate no vinculante

Aquí está la vista del modelo principal

public class RoleVM { 

[Required] 
[Display(Name = "Name of the Role")] 
public string Role {get; set;} 

public IEnumerable<RolePermission> permissions { get; set; } 

} 

Aquí está la clase RolePermission

public class RolePermission { 

public int id; 

public bool permission_value; 

public string name { get; set; } 

} 

Aquí es conseguir Crear Método en el controlador

public ActionResult Create() { 

     RoleVM role_vm = new RoleVM(); 

     var allpermissions = from p 
     in permission_repo.GetPermissions() 
     select p; 

     role_vm.permissions = from p 
     in allpermissions 
     select new RolePermission 
     { name = p.name, id = p.PermissionId, permission_value = false }; 

     return View(role_vm); 
    } 

Aquí es el archivo Create.cshtml

@model RoleVM 
@using (Html.BeginForm("Create", "Role", 
FormMethod.Post, new { @class = "permission_form" })) 
{ 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>RoleVM</legend> 

    <div class="form-item"> 
     @Html.LabelFor(model => model.Role) 

     @Html.EditorFor(model => model.Role) 
     @Html.ValidationMessageFor(model => model.Role) 
    </div> 

    @Html.EditorFor(model => model.permissions) 

    <p> 
     <input class="submit-btn" type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

Siguiente Aquí está el archivo rolepermissions.cshtml situado en ~/Vistas/shared/EditorTemplates

@model RolePermission 

<div class="form-item"> 
     @Html.HiddenFor(modelItem => modelItem.id) 
     @Html.LabelFor(modelItem => modelItem.permission_value, Model.name) 
     @Html.CheckBoxFor(modelItem => modelItem.permission_value) 
</div> 

He aquí un ejemplo de uno de los elementos HTML que se representa en la página

<div class="form-item"> 

     <input data-val="true" data-val-number="The field Int32 must be a number." data-val-required="The Int32 field is required." id="permissions_2__id" name="permissions[2].id" type="hidden" value="3" /> 

     <label for="permissions_2__permission_value">Role-Edit</label> 
     <input data-val="true" data-val-required="The Boolean field is required." id="permissions_2__permission_value" name="permissions[2].permission_value" 
type="checkbox" value="true" /><input name="permissions[2].permission_value" type="hidden" value="false" /> 

</div> 

Finalmente, aquí está el método Create POST

[HttpPost] 
    public ActionResult Create(RoleVM rolevm) 
    { 

     //In here rolevm.role is populated based on the textbox input 
     //However rolevm.permissions is there with the correct 
     //number of items, but the values all are not binded 
     // id is null, name is empty, and permission_value is false 
     // regardless of which checkboxes were checked 


     return RedirectToAction("Index"); 
    } 

Cualquier ayuda sobre la encuadernación es demandar con el modelo publicado sería realmente genial.

Respuesta

11

Esto era un problema simple, si alguien más se entera, quizás esto les ayude. No tenía las propiedades en la clase declaradas como propiedades con get; conjunto;

public class RolePermission { 

public int id { get; set; } 

public bool permission_value { get; set; } 

public string name { get; set; } 

} 
+0

¡Muchas gracias! – Evgeny

+1

Ayudé a mi compañero, me he estado preguntando por qué mi modelo no estaba publicando ciertos valores en el formulario, luego leí esto y le dije que verificaría mi modelo de vista y ciertas propiedades ciertas no tenían accesodores en las propiedades – John

+0

¿Pero encontró por qué los accesorios? ¿son requeridos? ¿Hay algo que establezca la propiedad debajo del descriptor para hidratar la entidad? – ruffin

Cuestiones relacionadas