IList 在回发更新的复选框时返回 count=0
IList returning count=0 on posting back updated checkboxes
我正在使用 asp.net-core 和 razor pages。我正在尝试更新 table 中的复选框。
单击按钮保存时,我通过 asp-route-for 因为我想知道列表中有多少项目但是我的 IList usersAccessRights 返回 count = 0 并跳过更新函数中的 foreach。还有其他方法可以接收多少项目并更新 table 复选框吗?
cshtml.cs:
public IActionResult OnPost(int id, string groupAccessName, bool chkDefaultGroup, IList<OutputAccessRights> usersAccessRights, string returnUrl = null){
Update(Convert.ToInt16(groupAccessID),usersAccessRights);
return RedirectToAction("Group AccessDetails", "Form", new { id = GroupAccessID, searchString = SearchString, searchInt = SearchInt }).WithSuccess("Success!", "Updated item!");
}
private void Update(short GroupAccessID, IList<OutputAccessRights> usersAccessRights)
{ Security Security = new Security();
IDataReader dr;
byte MainMenuId = 0;
byte SubMenuId = 0;
string Operation = "";
string OperationId = "";
foreach (var item in usersAccessRights)
{
MainMenuId = Convert.ToByte(item.MainMenuID);
SubMenuId = Convert.ToByte(item.SubMenuID);
//*** Add
OperationId = "A";
if (item.ChkAddRight == true)
Operation = "ADD";
else
Operation = "REMOVE";
Security.GroupAccessRightsMaintain(BellaMain.GlobalVariable.SystemID, Convert.ToInt16(GroupAccessID), MainMenuId, SubMenuId, OperationId, Operation);
//*** Delete
cshtml - 按钮保存:
<div class="col-sm-4">
@if (Model.Details != true)
{
<button type="submit" class="btn btn-primary" asp-page="Group AccessDetails" asp-route-usersAccessRights="@Model.UsersAccessRights">@Localizer["Save"]</button>
}
<a asp-page="Group Access" asp-route-searchString="@Model.SearchString" asp-route-searchInt="@Model.SearchInt">@Localizer["Back to Group"]</a>
</div>
cshtml-table 用户访问权限:
@if (Model.UsersAccessRights != null)
{<table class="table table-striped table-bordered dataTable tableAccessRights" id="tableAccessRights" style="width:100%">
<thead>
<tr>
<th>
MainMenu
</th>
<th>
SubMenu
</th>
<th>
Operation
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.UsersAccessRights){ <tr>
<td>
@if (Model.GroupAccessID == 0)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkUserAccessRights" id="chkUserAccessRights" asp-for="@item.ChkUserAccessRights"/>
@Html.DisplayFor(modelItem => item.MainMenuDescription)
}
else
{
@if (Model.Details != true)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkUserAccessRights" id="chkUserAccessRights" asp-for="@item.ChkUserAccessRights"/>
@Html.DisplayFor(modelItem => item.MainMenuDescription)
<span class="text-danger"></span>
}
else
{
<input type="checkbox" class="form-check-inline" name="@item.ChkUserAccessRights" id="chkUserAccessRights" disabled readonly="readonly" />
@Html.DisplayFor(modelItem => item.MainMenuDescription)
}
}
</td>
<td>
@Html.DisplayFor(modelItem => item.SubMenuDescription)
</td>
<td>
@if (Model.GroupAccessID == 0)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkAddRight" id="chkAddRight" asp-for="@item.ChkAddRight"/>
<label for="chkAddRight">Insert</label>
}
else
{
@if (Model.Details != true)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkAddRight" id="chkAddRight" asp-for="@item.ChkAddRight"/>
<label for="chkAddRight">Insert</label>
<span class="text-danger"></span>
}
else
{
<input type="checkbox" class="form-check-inline" name="@item.ChkAddRight" id="chkAddRight" disabled readonly="readonly" asp-for="@item.ChkAddRight"/>
<label for="chkAddRight">Insert</label>
}
}
}
下面是一个简单的演示:
1.Model:
public class OutputAccessRights
{
public int Id { get; set; }
public bool ChkUserAccessRights { get; set; }
public string SubMenuDescription { get; set; }
public string MainMenuDescription { get; set; }
public bool ChkAddRight { get; set; }
}
2.Edit.cshtml:
<form method="post">
<table class="table table-striped table-bordered dataTable tableAccessRights" id="tableAccessRights" style="width:100%">
<thead>
<tr>
<th>
MainMenu
</th>
<th>
SubMenu
</th>
<th>
Operation
</th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.UsersAccessRights.Count(); i++)
{
<tr>
<td>
<input class="form-check-inline"asp-for="UsersAccessRights[i].ChkUserAccessRights" />
@Model.UsersAccessRights[i].MainMenuDescription
</td>
<td>
@Model.UsersAccessRights[i].SubMenuDescription
</td>
<td>
<input class="form-check-inline" asp-for="UsersAccessRights[i].ChkAddRight" />
<label for="chkAddRight">Insert</label>
</td>
</tr>
}
</tbody>
</table>
<button type="submit" class="btn btn-primary" >Save</button>
</form>
3.Edit.cshtml.cs:
public class EditModel : PageModel
{
private readonly RazorContext _context;
public EditModel(RazorContext context)
{
_context = context;
}
[BindProperty]
public IList<OutputAccessRights> UsersAccessRights { get; set; }
public async Task<IActionResult> OnGetAsync()
{
UsersAccessRights = await _context.OutputAccessRights.ToListAsync();
if (UsersAccessRights == null)
{
return NotFound();
}
return Page();
}
public async Task<IActionResult> OnPostAsync(IList<OutputAccessRights> usersAccessRights)
{
//do your stuff...
}
}
4.Result:
我正在使用 asp.net-core 和 razor pages。我正在尝试更新 table 中的复选框。 单击按钮保存时,我通过 asp-route-for 因为我想知道列表中有多少项目但是我的 IList usersAccessRights 返回 count = 0 并跳过更新函数中的 foreach。还有其他方法可以接收多少项目并更新 table 复选框吗?
cshtml.cs:
public IActionResult OnPost(int id, string groupAccessName, bool chkDefaultGroup, IList<OutputAccessRights> usersAccessRights, string returnUrl = null){
Update(Convert.ToInt16(groupAccessID),usersAccessRights);
return RedirectToAction("Group AccessDetails", "Form", new { id = GroupAccessID, searchString = SearchString, searchInt = SearchInt }).WithSuccess("Success!", "Updated item!");
}
private void Update(short GroupAccessID, IList<OutputAccessRights> usersAccessRights)
{ Security Security = new Security();
IDataReader dr;
byte MainMenuId = 0;
byte SubMenuId = 0;
string Operation = "";
string OperationId = "";
foreach (var item in usersAccessRights)
{
MainMenuId = Convert.ToByte(item.MainMenuID);
SubMenuId = Convert.ToByte(item.SubMenuID);
//*** Add
OperationId = "A";
if (item.ChkAddRight == true)
Operation = "ADD";
else
Operation = "REMOVE";
Security.GroupAccessRightsMaintain(BellaMain.GlobalVariable.SystemID, Convert.ToInt16(GroupAccessID), MainMenuId, SubMenuId, OperationId, Operation);
//*** Delete
cshtml - 按钮保存:
<div class="col-sm-4">
@if (Model.Details != true)
{
<button type="submit" class="btn btn-primary" asp-page="Group AccessDetails" asp-route-usersAccessRights="@Model.UsersAccessRights">@Localizer["Save"]</button>
}
<a asp-page="Group Access" asp-route-searchString="@Model.SearchString" asp-route-searchInt="@Model.SearchInt">@Localizer["Back to Group"]</a>
</div>
cshtml-table 用户访问权限:
@if (Model.UsersAccessRights != null)
{<table class="table table-striped table-bordered dataTable tableAccessRights" id="tableAccessRights" style="width:100%">
<thead>
<tr>
<th>
MainMenu
</th>
<th>
SubMenu
</th>
<th>
Operation
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.UsersAccessRights){ <tr>
<td>
@if (Model.GroupAccessID == 0)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkUserAccessRights" id="chkUserAccessRights" asp-for="@item.ChkUserAccessRights"/>
@Html.DisplayFor(modelItem => item.MainMenuDescription)
}
else
{
@if (Model.Details != true)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkUserAccessRights" id="chkUserAccessRights" asp-for="@item.ChkUserAccessRights"/>
@Html.DisplayFor(modelItem => item.MainMenuDescription)
<span class="text-danger"></span>
}
else
{
<input type="checkbox" class="form-check-inline" name="@item.ChkUserAccessRights" id="chkUserAccessRights" disabled readonly="readonly" />
@Html.DisplayFor(modelItem => item.MainMenuDescription)
}
}
</td>
<td>
@Html.DisplayFor(modelItem => item.SubMenuDescription)
</td>
<td>
@if (Model.GroupAccessID == 0)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkAddRight" id="chkAddRight" asp-for="@item.ChkAddRight"/>
<label for="chkAddRight">Insert</label>
}
else
{
@if (Model.Details != true)
{
<input type="checkbox" class="form-check-inline" name="@item.ChkAddRight" id="chkAddRight" asp-for="@item.ChkAddRight"/>
<label for="chkAddRight">Insert</label>
<span class="text-danger"></span>
}
else
{
<input type="checkbox" class="form-check-inline" name="@item.ChkAddRight" id="chkAddRight" disabled readonly="readonly" asp-for="@item.ChkAddRight"/>
<label for="chkAddRight">Insert</label>
}
}
}
下面是一个简单的演示:
1.Model:
public class OutputAccessRights
{
public int Id { get; set; }
public bool ChkUserAccessRights { get; set; }
public string SubMenuDescription { get; set; }
public string MainMenuDescription { get; set; }
public bool ChkAddRight { get; set; }
}
2.Edit.cshtml:
<form method="post">
<table class="table table-striped table-bordered dataTable tableAccessRights" id="tableAccessRights" style="width:100%">
<thead>
<tr>
<th>
MainMenu
</th>
<th>
SubMenu
</th>
<th>
Operation
</th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.UsersAccessRights.Count(); i++)
{
<tr>
<td>
<input class="form-check-inline"asp-for="UsersAccessRights[i].ChkUserAccessRights" />
@Model.UsersAccessRights[i].MainMenuDescription
</td>
<td>
@Model.UsersAccessRights[i].SubMenuDescription
</td>
<td>
<input class="form-check-inline" asp-for="UsersAccessRights[i].ChkAddRight" />
<label for="chkAddRight">Insert</label>
</td>
</tr>
}
</tbody>
</table>
<button type="submit" class="btn btn-primary" >Save</button>
</form>
3.Edit.cshtml.cs:
public class EditModel : PageModel
{
private readonly RazorContext _context;
public EditModel(RazorContext context)
{
_context = context;
}
[BindProperty]
public IList<OutputAccessRights> UsersAccessRights { get; set; }
public async Task<IActionResult> OnGetAsync()
{
UsersAccessRights = await _context.OutputAccessRights.ToListAsync();
if (UsersAccessRights == null)
{
return NotFound();
}
return Page();
}
public async Task<IActionResult> OnPostAsync(IList<OutputAccessRights> usersAccessRights)
{
//do your stuff...
}
}
4.Result: