我有一个复选框列表,其中的值是从数据库表加载的。当用户选择特定客户时,它将数据库值更新为“1”,但在 razor 页面视图中,这些值显示为未选中。我不知道我哪里错了。
这是我的代码:
AccessRights
(模特班)
public class AccessRights
{
[Key]
public int Id { get; set; }
public int EmployeeId { get; set; }
[Display(Name = "Users")]
public string Username { get; set; }
public string ADUsername { get; set; }
public int CustomerId { get; set; }
public string CustomerName { get; set; }
public bool isSelected { get; set; }
public string CreatedBy { get; set; }
public DateTime? CreatedTimeStamp { get; set; }
public string LastModifiedBy { get; set; }
public DateTime? LastModifiedTimeStamp { get; set; }
}
Edit.cshtml
:
<div class="form-group">
<label class="control-label"> Access To Customers</label>
<div class="checkbox checkboxlist">
@{
foreach (var customers in Model.CustomersChecked)
{
<input type="checkbox" id="@customers.Value" value="@customers.Value" name="CustomersChecked" checked="@customers.Selected" />
<label class="text-black">@customers.Text</label><br/>
//<input type="hidden" asp-for="@Model.CustomersChecked" value="@customers.Id">
}
}
</div>
<span class="text-danger"></span>
</div>
Edit.cshtml.cs
:
[BindProperty]
public List<SelectListItem> CustomersChecked { get; set; }
public async Task<IActionResult> OnGetAsync(int? id)
{
if (id == null || _context.AccessRights == null)
{
return NotFound();
}
var accessrights = await _context.AccessRights.FirstOrDefaultAsync(m => m.EmployeeId == id);
AccessRights = accessrights;
CustomersChecked = (from p in _context.AccessRights.Where(m => m.EmployeeId == id)
select new SelectListItem
{
Text = p.CustomerName,
Value = p.CustomerId.ToString()
}).ToList();
return Page();
}
public async Task<IActionResult> OnPostAsync(string[] CustomersChecked)
{
List<SelectListItem> items = (from p in _context.AccessRights.Where(m => m.EmployeeId == AccessRights.EmployeeId)
select new SelectListItem
{
Text = p.CustomerName,
Value = p.CustomerId.ToString()
}).ToList();
foreach (SelectListItem item in items)
{
if (CustomersChecked.Contains(item.Value))
{
item.Selected = true;
}
else
{
item.Selected = false;
}
AccessRights.LastModifiedBy = HttpContext.Session.GetString("DisplayName").Trim();
AccessRights.LastModifiedTimeStamp = DateTime.Now;
await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE [AccessRights] SET [isSelected] = {item.Selected}, [LastModifiedBy] = {AccessRights.LastModifiedBy}, [LastModifiedTimeStamp] = {AccessRights.LastModifiedTimeStamp} WHERE [EmployeeId] = {AccessRights.EmployeeId} AND [CustomerName] = {item.Text}");
}
return RedirectToPage("./Index");
}
感谢您的帮助!
谢谢!
如果不使用 HTMLHelper,你会做这样的事情:
foreach (var customers in Model.CustomersChecked)
{
@if (customers.Selected)
{
<input type="checkbox" id="@customers.Value" value="@customers.Value" name="CustomersChecked" checked />
}
else
{
<input type="checkbox" id="@customers.Value" value="@customers.Value" name="CustomersChecked" />
}
}
但是,读取状态可能会变得复杂。我相信您只会将检查的值返回到控制器,除非您使用一些具有相同名称属性的隐藏字段,并且每个字段的值设置为 true 或 false。两个 false = 未选中,true & false = 选中。如果您遇到此问题,请参阅此处的答案:ASP.NET CORE 复选框如何检查是否为真? HTMLHelper 将自动添加隐藏字段。