You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交BankHoliday记录后视图无法实时显示新数据的技术咨询

问题:ASP.NET Core视图提交POST后无法实时显示新增数据

在ASP.NET Core项目中,新增BankHoliday记录并调用POST方法后,数据库已成功添加新记录,但视图仍显示更新前的数据。只有重新从菜单选择BankHoliday选项触发HttpGet方法,才能看到更新后的数据。尝试通过Return Redirect跳转到HttpGet,但出现样式问题无法使用,需要无需跳转即可实时展示新数据的解决方案。

原代码

Controller代码

[HttpGet]
public IActionResult BankHolidaySettings(int DEPT = 0, int YR = 0)
{
    return View(bankHoliday);
}

[HttpPost]
public IActionResult BankHolidaySettings(BankHoliday bankHoliday)
{
    if (ModelState.IsValid)
    {
        id =  _unitOfWork.BankHolidayRepo.AddBankHoliday(bankHolidayToAdd);

        ViewBag.Result = "Saved successfully";
            
        ModelState.Clear();
    }

    return View(bankHoliday);
}

View代码(BankHolidaySettings.cshtml)

<form asp-controller="Employee"
      asp-action="BankHolidaySettings"
      data-ajax="true" data-ajax-method="POST"
      data-ajax-mode="replace" data-ajax-update="#content"
      class="form-horizontal" role="form"
      data-parsley-validate
      novalidate>
    <table id="holidays" class="table table-bordered table-striped ">
        <thead>
            <tr>
               <td>Date </td>
               <td>Depot No</td>
               <td>Depot </td>
               <td>Department </td>
               <td>Description </td>
               <td class="hidden">Edit</td>
               <td>Delete</td>
            </tr>
       </thead>
       <tbody>
             @foreach (BankHoliday bankHoliday in ViewBag.BankHolidays)
             {
          <tr>
               <td>@bankHoliday.Holidaydate</td>
               <td>@bankHoliday.DepotNo</td>
              <td>@bankHoliday.DepotName</td>
              <td>@bankHoliday.DepartmentName</td>
              <td>
                  @bankHoliday.Description
                </td>
               <td class="hidden"><a href="#"  
        </tr>
        }
        </tbody>
        </table>
<div class="center-block">
    <button type="submit" id="btnsubmit" class="btn btn-primary form-control submit">Save</button>
</div>

<script>
$(document).ready(function () {
        $('#btnsubmit').click(function (e) {
            e.preventDefault(); // Prevent the default form submission
            var formData = $('form').serialize(); // Serialize the form data
             $.ajax({
                type: "POST",
                url: "/Employee/BankHolidaySettings",
                data: formData,
                success: function (response) {
                    
                },
                error: function (error) {
                    // Handle the error response
                }
            });
        });
});
</script>

解决方案

1. 修正POST方法,返回更新后的数据集

原POST方法仅返回提交的bankHoliday对象,未重新查询最新的银行假日列表,导致ViewBag数据未更新。需要在保存成功后重新获取完整列表:

[HttpGet]
public IActionResult BankHolidaySettings(int DEPT = 0, int YR = 0)
{
    // 获取最新银行假日列表并赋值给ViewBag
    var bankHolidays = _unitOfWork.BankHolidayRepo.GetAllBankHolidays(DEPT, YR);
    ViewBag.BankHolidays = bankHolidays;
    return View();
}

[HttpPost]
public IActionResult BankHolidaySettings(BankHoliday bankHoliday)
{
    if (ModelState.IsValid)
    {
        var id = _unitOfWork.BankHolidayRepo.AddBankHoliday(bankHoliday);
        ViewBag.Result = "Saved successfully";
        ModelState.Clear();
        
        // 保存成功后重新获取最新列表
        var updatedBankHolidays = _unitOfWork.BankHolidayRepo.GetAllBankHolidays(0, 0); // 按需传递参数
        ViewBag.BankHolidays = updatedBankHolidays;
    }
    else
    {
        // 验证失败时也要确保ViewBag有旧数据,避免表格为空
        ViewBag.BankHolidays = _unitOfWork.BankHolidayRepo.GetAllBankHolidays(0, 0);
    }
    return View();
}

2. 统一AJAX提交逻辑,避免冲突

原视图同时使用了data-ajax属性和自定义jQuery AJAX,存在逻辑冲突,可选择以下两种方案:

方案一:使用ASP.NET Unobtrusive AJAX(推荐)

移除自定义jQuery AJAX代码,确保项目已引入jquery.unobtrusive-ajax.js,并将表格包裹在data-ajax-update指定的容器中:

<div id="content">
    <form asp-controller="Employee"
          asp-action="BankHolidaySettings"
          data-ajax="true" data-ajax-method="POST"
          data-ajax-mode="replace" data-ajax-update="#content"
          class="form-horizontal" role="form"
          data-parsley-validate
          novalidate>
        <!-- 新增记录的输入字段需补充在此处 -->
        <table id="holidays" class="table table-bordered table-striped ">
            <!-- 表格内容保持不变 -->
        </table>
        <div class="center-block">
            <button type="submit" id="btnsubmit" class="btn btn-primary form-control submit">Save</button>
        </div>
    </form>
</div>

方案二:自定义AJAX动态添加新行

若不想替换整个区域,可让POST方法返回JSON数据,在AJAX成功后动态插入新行:

修改Controller POST方法
[HttpPost]
public IActionResult BankHolidaySettings(BankHoliday bankHoliday)
{
    if (ModelState.IsValid)
    {
        var newHoliday = _unitOfWork.BankHolidayRepo.AddBankHoliday(bankHoliday);
        return Json(new { success = true, holiday = newHoliday, message = "Saved successfully" });
    }
    return Json(new { success = false, message = "Validation failed" });
}
修改视图AJAX代码
<script>
$(document).ready(function () {
    $('#btnsubmit').click(function (e) {
        e.preventDefault();
        var formData = $('form').serialize();
        $.ajax({
            type: "POST",
            url: "/Employee/BankHolidaySettings",
            data: formData,
            success: function (response) {
                if (response.success) {
                    alert(response.message);
                    // 动态插入新行到表格
                    var newRow = `
                        <tr>
                            <td>${response.holiday.Holidaydate}</td>
                            <td>${response.holiday.DepotNo}</td>
                            <td>${response.holiday.DepotName}</td>
                            <td>${response.holiday.DepartmentName}</td>
                            <td>${response.holiday.Description}</td>
                            <td class="hidden"><a href="#"></a></td>
                            <td><!-- 补充删除按钮 --></td>
                        </tr>
                    `;
                    $('#holidays tbody').append(newRow);
                    // 清空表单
                    $('form')[0].reset();
                } else {
                    alert(response.message);
                }
            },
            error: function () {
                alert('保存失败');
            }
        });
    });
});
</script>

3. 注意事项

  • 确保GetAllBankHolidays方法能正确获取最新数据库记录,避免EF Core上下文缓存问题(必要时可使用AsNoTracking()或重新查询)。
  • 视图中需补充新增BankHoliday的输入字段,确保提交的bankHoliday对象数据完整。

内容的提问来源于stack exchange,提问作者Alevel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:37:33