在 .Net Core 3.1 上发布时未使用新 ViewModel 重新加载表单

Posted

技术标签:

【中文标题】在 .Net Core 3.1 上发布时未使用新 ViewModel 重新加载表单【英文标题】:Form not reloaded with new ViewModel when posting on .Net Core 3.1 【发布时间】:2021-09-24 01:43:02 【问题描述】:

我试图在调用 post 方法后更改屏幕上的值。即使使用 ModelState.Clear();方法添加它仍然没有反映屏幕上的新值。请注意,我使用的是 jQuery Unobtrusive AJAX v3.2.6 库。

请在下面查看我的剃须刀页面和控制器代码。

@model TestApp.ViewModels.EmployeeViewModel

<form method="post"
      data-ajax="true"
      data-ajax-method="post"
      data-ajax-url="@Url.Action("Detail", "Employee")">

    <input asp-for="EmployeeFirstName" />
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

控制器

public IActionResult Detail()

    EmployeeViewModel employeeViewModel= new EmployeeViewModel ();
    employeeViewModel.EmployeeFirstName = "John";
    return View(employeeViewModel);

    
[HttpPost]
public IActionResult Detail(EmployeeViewModel employeeViewModel)

    employeeViewModel.EmployeeFirstName = "Brian";
    ModelState.Clear();
    return View(employeeViewModel);

【问题讨论】:

【参考方案1】:

由于你使用了不显眼的ajax,所以它会返回部分视图的html代码,但不会刷新部分视图。如果你想刷新部分视图,你可以尝试用数据替换html代码- ajax-complete。这是一个工作演示:

控制器:

 public IActionResult Detail()
        
            EmployeeViewModel employeeViewModel = new EmployeeViewModel();
            employeeViewModel.EmployeeFirstName = "John";
            return View(employeeViewModel);
        

        [HttpPost]
        public IActionResult Detail(EmployeeViewModel employeeViewModel)
           
           employeeViewModel.EmployeeFirstName = "Brian";
            ModelState.Clear();
            return PartialView("~/Views/_Partial.cshtml", employeeViewModel);
        

查看:

@model WebApplication107.Models.EmployeeViewModel

<div class="row main-section-border">
    <div id="div1" class="col-sm-12">

        @
            await Html.RenderPartialAsync("~/Views/_Partial.cshtml", Model);
        
    </div>
</div>

@section scripts
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ajax-unobtrusive/3.2.6/jquery.unobtrusive-ajax.js"></script>
    <script>
        completed = function (xhr) 
            $("#div1").html(xhr.responseText);
        ;
    </script>

_部分视图:

@model WebApplication107.Models.EmployeeViewModel
<form method="post"
      data-ajax="true"
      data-ajax-method="post"
      data-ajax-url="@Url.Action("Detail", "Test")"
      data-ajax-complete="completed"
      >

    <input asp-for="EmployeeFirstName" />
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

结果:

【讨论】:

以上是关于在 .Net Core 3.1 上发布时未使用新 ViewModel 重新加载表单的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core api 项目 3.1 在 IIS 上发布

使用 ASP.NET Core 6 Minimal API 在 Azure 中停止 Web 应用程序时未调用 BackgroundService StopAsync

.NET Core 2 构建在 .NET Core 3.1 中不起作用

如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1

.Net core 3.1 应用程序部署在 Windows 7 上

发布时未调用具有 Telerik Kendo Grid Read 方法 ([DataSourceRequest]) 的 ASP.NET Core 2.0