动态复选框未在 ASP.NET Core Razor 页面中显示所选值

问题描述 投票:0回答:1

我有一个复选框列表,其中的值是从数据库表加载的。当用户选择特定客户时,它将数据库值更新为“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");
}

感谢您的帮助!

谢谢!

asp.net-core checkbox razor-pages
1个回答
0
投票

如果不使用 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 将自动添加隐藏字段。

© www.soinside.com 2019 - 2024. All rights reserved.