2014-12-01 2 views
0

У меня возникла проблема с попыткой передать модель с частичного представления на контроллер для дальнейшей обработки.Модель пуста при отправке формы с частичного просмотра на контроллер

Это мой контроллер:

public ActionResult Index() 
{ 
    IList<ActionRoleEntity> permissionCollection = new SecurityManager().GetPermissionCollection(); 

    var model = new PermissionsModel 
    { 
     PermissionCollection = permissionCollection 
    }; 
    return View(model); 
}  

Это одна на мой взгляд Index. который, как вы увидите, включает в себя частичное представление _Permissions.

@model WebApp.ViewModels.PermissionsModel 
<script> 
    $(document).ready(function() { 
     $('#AdminTabs').tabs(); 
    }); 
</script> 
<div id="AdminTabs"> 
    <ul> 
     <li><a href="#tabs-1">Permissions</a></li> 
     <li><a href="#tabs-2">Insights</a></li>   
    </ul>  
    <div id="tabs-1">   
     @{ Html.RenderPartial("_Permissions"); } 
    </div> 
    <div id="tabs-2"> 
     <p>    
     </p> 
    </div> 
</div> 

И это мой частичный вид:

@model WebApp.ViewModels.PermissionsModel 
@using (Html.BeginForm("Permissions", "Admin", FormMethod.Post)) 
{ 
    <table id="example" class="display"> 
    <thead> 
     <tr> 
      <th>Role</th> 
      <th>Workflow</th> 
      <th>Stage</th> 
      <th>Action</th>    
      <th>Read</th> 
      <th>Update</th> 
      <th></th> 
     </tr> 
    </thead>  
    <tbody> 
     @for (var i = 0; i < Model.PermissionCollection.Count; i++) 
     { 
      <tr> 
       <td>@Html.DisplayTextFor(m => m.PermissionCollection[i].RoleName)</td> 
       <td>@Html.DisplayTextFor(m => m.PermissionCollection[i].Workflow)</td> 
       <td>@Html.DisplayTextFor(m => m.PermissionCollection[i].StageName)</td> 
       <td>@Html.DisplayTextFor(m => m.PermissionCollection[i].ActionName)</td>     
       <td>@Html.CheckBoxFor(m => m.PermissionCollection[i].Get)</td> 
       <td>@Html.CheckBoxFor(m => m.PermissionCollection[i].Post)</td> 
       <td>@Html.HiddenFor(m => m.PermissionCollection[i].hasChanged)</td> 
      </tr> 
     } 
    </tbody> 
    </table> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Save" />  
} 

модель правильно заполняется для контроллера и HTML кода в частичном виде предоставляется без каких-либо проблем. Однако, когда я отправляю форму, нажав кнопку отправки в _permissions Partial View ... метод «Разрешения» в контроллере «Администратор», который обрабатывает это действие, получает пустую модель «PermissionModel».

Это код для этого действия:

[HttpPost] 
public ActionResult Permissions(PermissionsModel permissionsModel) 
{ 
    IList<ActionRoleEntity> actionRoleEntity = permissionsModel.PermissionCollection.Where(m => m.hasChanged == true).ToList<vw_ActionRoleEntity>(); 

    // Save changed permission to database 

    return View("Index"); 
} 

И, наконец, это как модель разрешений закодирована:

public class PermissionsModel 
{   
    public IList<ActionRoleEntity> PermissionCollection { get; set; } 
} 

Javascript обновить свойство hasChanged в качестве ActionRoelEntity.

$("#example input[type='checkbox'").change(function() { 
     var arrayCheckboxId = $(this).attr('id').split('_'); 
     var index = arrayCheckboxId[2]; // Gets specific row Id. 
     $('#PermissionCollection_' + index + '__hasChanged').val(true); 
    }); 

Если вы видите что-то, что я могу пропустить, пожалуйста, советую.

+0

Вы положили '' @model заявление WebApp.ViewModels.PermissionsModel'' поверх частичного представления? похоже, что частичное представление не сильно относится к модели. –

+0

Показать код модели 'Permissions'. У 'PermissionCollection' и его свойств есть сеттеры? –

+0

@ EhsanSaijad - И основной вид, и частичный вид строго типизированы - я пропустил линию, но включил ее сейчас. Благодарю. – jmberon

ответ

1

Посмотрите, как ваша модель является именем в методе «Почта» и в представлении. Я вижу, что вы назвали модель на представлении @модели WebApp.ViewModels.PermissionsModel и в вашей лямбде присвоений модели является м, и на вашем методе поста является permissionsModel. измените его на модель в обоих местах.

+0

Большое спасибо. Это решило проблему, у меня кончились волосы из-за вытаскивания их. Я заменил @ Html.DisplayTextFor (м => m.PermissionCollection [I] .RoleName) для @ Html.DisplayTextFor (модель => model.PermissionCollection [I] .RoleName) и метод в контроллере [ HttpPost] public Разрешения ActionResult (PermissionsModel model) {} – jmberon

Смежные вопросы