2012-07-14 17 views
5

C'è stato un sacco di domande su questo ... ma in qualche modo non riesco a far funzionare questo binding e sono ancora ottenere valori nulli nel mio modello di visualizzazione pubblicato. Questo è MVC 4..NET MVC 4 ViewModel fortemente tipizzato contenente Modello fortemente tipizzato con EditorFor e EditorTemplate vista parziale non vincolante

Ecco la Main View Modello

public class RoleVM { 

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

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

} 

Ecco il RolePermission Classe

public class RolePermission { 

public int id; 

public bool permission_value; 

public string name { get; set; } 

} 

Ecco GET Creare metodo nel controller

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); 
    } 

Qui è il file 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> 
} 

seguente Ecco il file rolepermissions.cshtml trova in ~/Vista/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> 

Ecco un esempio di uno degli elementi HTML che è resa a pagina

<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 ecco il metodo 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"); 
    } 

Qualsiasi aiuto sulla rilegatura è Sue con il modello pubblicato sarebbe davvero grandioso.

risposta

11

Questo era un problema semplice, se qualcuno lo incontra forse questo li aiuterà. Non avevo le proprietà sulla classe dichiarate come proprietà con get; impostato;

public class RolePermission { 

public int id { get; set; } 

public bool permission_value { get; set; } 

public string name { get; set; } 

} 
+0

Grazie mille! – Evgeny

+1

Mi ha aiutato amico, mi sono chiesto perché il mio modello di rilegatura non aveva inserito alcuni valori dal modulo, ho poi letto questo e ho detto che avrei controllato my viewModel e abbastanza sicuro alcune proprietà non avevano accessors sulle proprietà – John

+0

Ma hai trovato il motivo per cui gli accessors sono necessarie? Qualcosa sta impostando la proprietà sotto l'accessorio per idratare l'entità? – ruffin

Problemi correlati