【问题标题】:Passing HTML table information from cshtml to method onpost cshtml.cs using PageModel使用 PageModel 将 HTML 表格信息从 cshtml 传递到方法 onpost cshtml.cs
【发布时间】:2023-03-12 14:06:04
【问题描述】:

我正在使用 asp.net 核心和引导程序,当我选中和取消选中复选框时,我正在尝试更新我的表格。问题是,当我单击按钮保存以更新表格时,我想接收所有信息,但是当我尝试这样做时,我的 IList<OutputAccessRights> userAccessRights 返回 Count = 0。我怎样才能在不丢失所有内容的情况下回发?我可以使用jquery吗? javascript?

.cs:

public IActionResult OnPost(int id, string groupAccessName, bool chkDefaultGroup, IList<OutputAccessRights> userAccessRights, string returnUrl = null)
        {
            ReturnUrl = returnUrl;

                else //Update
                {
                    Security security = new Security();
                    security.GroupAccessUpdate(BellaMain.GlobalVariable.SystemID, Convert.ToInt16(groupAccessID), groupAccessName, false);
                    Update(Convert.ToInt16(groupAccessID), userAccessRights);
                    GroupAccessID = id;
                    GroupAccessName = groupAccessName;

                    return RedirectToAction("Group AccessDetails", "Form", new { id = GroupAccessID, searchString = SearchString, searchInt = SearchInt }).WithSuccess("Success!", "Updated item!");
                }

            return Page();
        }

型号:

 public class GroupAccessDetailsModel : PageModel
    {
        private readonly ILogger<GroupAccessDetailsModel> _logger;

        public GroupAccessDetailsModel(ILogger<GroupAccessDetailsModel> logger)
        {
            _logger = logger;
        }
        public class OutputAccessRights
        {
            public byte MainMenuID { get; set; }
            public byte SubMenuID { get; set; }
            public byte OperationID { get; set; }
            public string MainMenuDescription { get; set; }
            public string SubMenuDescription { get; set; }
            public string Operation { get; set; }
            public bool ChkUserAccessRights { get; set; }
            public bool ChkAddRight { get; set; }
            public bool ChkUpdateRight { get; set; }
            public bool ChkDelete { get; set; }
            public bool FlagDefaultGroupAlreadySet { get; set; }
        }
        [BindProperty]
        public IList<OutputAccessRights> UsersAccessRights { get; set; }
}

html:

 @if (Model.UsersAccessRights != null)
{
    <table class="table table-striped table-bordered dataTable tableAccessRights" name="userAccessRights" id="userAccessRights" 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>
                            }
                        }
                        @if (Model.GroupAccessID == 0)
                        {
                            <input type="checkbox" class="form-check-inline" name="@item.ChkDelete" id="chkDelete" asp-for="@item.ChkDelete" />
                            <label for="chkDelete">Delete</label>
                        }
                        else
                        {
                            @if (Model.Details != true)
                            {
                                <input type="checkbox" class="form-check-inline" name="@item.ChkDelete" id="chkDelete" asp-for="@item.ChkDelete" />
                                <label for="chkDelete">Delete</label>
                                <span class="text-danger"></span>
                            }
                            else
                            {
                                <input type="checkbox" class="form-check-inline" name="@item.ChkDelete" id="chkDelete" disabled readonly="readonly" asp-for="@item.ChkDelete" />
                                <label for="chkDelete">Delete</label>
                            }
                        }
                        @if (Model.GroupAccessID == 0)
                        {
                            <input type="checkbox" class="form-check-inline" name="@item.ChkUpdateRight" id="chkUpdateRight" asp-for="@item.ChkUpdateRight" />
                            <label for="chkUpdateRight">Update</label>
                        }
                        else
                        {
                            @if (Model.Details != true)
                            {
                                <input type="checkbox" class="form-check-inline" name="@item.ChkUpdateRight" id="chkUpdateRight" asp-for="@item.ChkUpdateRight" />
                                <label for="chkUpdateRight">Update</label>
                                <span class="text-danger"></span>
                            }
                            else
                            {
                                <input type="checkbox" class="form-check-inline" name="@item.ChkUpdateRight" id="chkUpdateRight" disabled readonly="readonly" asp-for="@item.ChkUpdateRight" />
                                <label for="chkUpdateRight">Update</label>
                            }
                        }
                    </td>
                </tr>
            }

        </tbody>
    </table><button type="submit" class="btn btn-primary" asp-page="Group AccessDetails" asp-route-userAccessRights="@Model.UsersAccessRights">@Localizer["Save"]</button>
}

【问题讨论】:

    标签: javascript c# jquery asp.net post


    【解决方案1】:

    http 帖子的基本原理意味着只有表单控件(输入、选择)被回发到服务器。

    用户更改的任何内容都应发回服务器,并重新集成到全新的获取请求中。

    所以模式是这样的:

    1. 加载页面(GET 请求,从数据库加载数据并在视图模型中返回,绑定到 HTML)
    2. 提交表单(包含用户输入的 POST 请求、绑定到视图模型、更新存储的数据)
    3. 重定向到 GET 操作(从数据库重新加载数据)

    在 POST / 表单提交后,您必须从任何地方重新获取数据。

    如果您没有将用户数据保存到数据库中,那么您只需要重新集成它。

    编辑:

    如果您真的想发布页面的整个状态,则必须将所有内容放入输入(类型为隐藏以对用户隐藏),以便将其发送回服务器。

    请记住,从输入返回的所有数据都是用户输入,不能被认为是正确的。

    编辑 2:

    简单示例:

    public ActionResult LoadPage()
    {
      var viewModel = service.GetViewModel();
      return View(viewModel);
    }
    
    [HttpPost]
    public ActionResult PostPage(MyViewModel postedViewModel)
    {
      service.UpdateData(postedViewModel);
    
      // either:
      var freshData = service.GetViewModel();
      return View(freshData);
    
      // or:
      // this is my preferred method, as it means that pressing F5 will not resubmit the old page
      return RedirectToAction("GetData");
    }
    
    // what I mean by integrating the data back into the fresh data:
    [HttpPost]
    public ActionResult PostWithIntegration(MyViewModel postedData)
    {
      var freshData = service.GetViewModel();
    
      freshData.Update(postedData);
    
      return View(freshData);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多