У меня проблема с попыткой передать модель из частичного представления в контроллер для дальнейшей обработки.
Это мой контроллер:
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... метод «Разрешения» в контроллере «Администратор», который обрабатывает это действие, получает пустую модель «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);
});
Если вы видите что-то, что я могу упустить, пожалуйста, посоветуйте.
@model WebApp.ViewModels.PermissionsModel
поверх своего частичного представления? похоже у вас частичный вид не сильно типичный для модели - person Ehsan Sajjad   schedule 01.12.2014Permissions
. Есть ли уPermissionCollection
и его свойств сеттеры? - person   schedule 01.12.2014@for(..
, который выдаст ошибку синтаксического анализатора? Это должно быть простоfor(...
. Если свойстваActionRoleEntity
имеют сеттеры, то они должны быть привязаны к коллекции (должны быть заполненыGet
, Post` иhasChanged
). - person   schedule 01.12.2014<table>
. Не вижу причин, по которым он не связывал бы эти 3 свойства. Но ваш пункт.Where()
кажется странным. Зачем вам отображать элементы дляActionRoleEntity
, где значениеhasChanged
равно false, если вы собираетесь игнорировать любые изменения, внесенные пользователем в состояния флажков? Заставьте меня думать, что вы задействовали какой-то javascript? - person   schedule 01.12.2014true
наfalse
или наоборот)? Например, вы не отключаете какие-либо элементы управления? - person   schedule 01.12.2014PermissionCollection
являетсяnull
. - person   schedule 01.12.2014$('#example input[type="checkbox"]').change(function () { $(this).closest('tr').find('input[type="hidden"]').val("True"); })
У вас нет входных данных сid="APS_PermissionCollection..."
(или, если вы это сделаете, ничего не будет привязано, потому что ваша модель не содержит свойства с именемAPS
) - person   schedule 01.12.2014