Имам проблем при опит да предам модел от частичен изглед към контролера за по-нататъшна обработка.
Това е моят контролер:
public ActionResult Index()
{
IList<ActionRoleEntity> permissionCollection = new SecurityManager().GetPermissionCollection();
var model = new PermissionsModel
{
PermissionCollection = permissionCollection
};
return View(model);
}
Този в моя индексен изглед. което, както виждате, включва частичен изглед _Permissions.
@model WebApp.ViewModels.PermissionsModel
<script>
$(document).ready(function () {
$('#AdminTabs').tabs();
});
</script>
<div id="AdminTabs">
<ul>
<li><a href="/bg#tabs-1">Permissions</a></li>
<li><a href="/bg#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 ... методът „Permissions“ в контролера „Admin“, който обработва това действие, получава празен модел „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
е невярно, ако след това ще игнорирате всички промени, които потребителят е направил в състоянията на квадратчето за отметка? Накарай ме да мисля, че имаш някакъв 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