使用来自 Razor View 的 ajax POST 在 ModelState 有效时显示确认 bootstrap 模态

Display Confirmation bootstrap Modal when ModelState is valid using an ajax POST from Razor View

我有一个场景,我需要在服务器上验证主模型后显示一个确认模式 - 使用数据注释,但我想实际提交到数据库以在确认模式而不是主要剃须刀视图:

一切都按预期工作,除了我无法全神贯注地了解如何在模态中显示确认部分视图。我可以重定向到部分视图,但我只需要在模式中使用它:

参见下面的伪代码:

C# - actions

[HttpGet]
public IActionResult ConfirmUser()
{
    //Get TempData model here:
    return PartialView(model);
}


[HttpPost]
public IActionResult ConfirmUser(ConfirmUser usermodel)
{
   //UserService.ConfirmUser(usermodel)
}

[HttpPost]
public IActionResult AddNewUser(UserModel)
{
    if (ModelState.IsValid)
    {
        //Some TempData logic here:

        return RedirectToAction("ConfirmUser");

    }
    return View(UserModel);
}

Js -in Razor View

      $("#add-new-User-form").submit(function (e) {

       e.preventDefault();
        var $form = $(this);
        $.post($form.attr("action"),
 $form.serialize())
.done(function(dt, status, req)
        {

           if ($form.valid()) {

                $('#add-job-container').html(dt); //container
                $('#add-job-modal').modal('show'); //modal

            } else
            {
                //???

            }
         

        })

     });

$form.valid() 有效,但只是客户端。我也尝试在视图上使用 ViewData.ModelState.IsValid 无济于事。 我假设我需要从操作中返回 Json 对象并在此基础上呈现表单 ?

1.If你想显示确认模式,你不能在后端使用RedirectToAction,因为ajax无法处理来自后端的重定向操作。

2.您无法在客户端访问ModelState,它只能在服务器端访问。

ModelState 无效 时,我看到你 return 使用模型 (return View(UserModel);) 的当前视图。 如果没有 ajax,此代码用于显示您填写的表格和错误消息。实际上,通过在您的场景中使用 ajax ,它将始终保持填写的表格并显示错误消息。

如果你只想显示带有模型数据和错误消息的视图,我建议你在后端return BadRequest。然后进入ajax.error函数,不用判断$form.valid().

您可以遵循完整的工作演示:

型号:

public class UserModel
{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Email { get; set; }
}

查看:

AddNewUser.cshtml

@model UserModel
<form asp-action="AddNewUser" id="add-new-User-form">
    <div>
        <label>Name</label>
        <input asp-for="Name" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <div>
         <label>Email</label>
         <input asp-for="Email" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>
    <input type="submit"  value="ADD" />
</form>


<div class="modal fade" id="add-job-modal" tabindex="-1"  aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Modal title</h5>
        @*<button type="button" class="close" data-dismiss="modal" aria-label="Close">  bootstrap version 4.x*@
        <button type="button" class="close" data-bs-dismiss="modal"="modal" aria-label="Close"> @*bootstrap version 5.x*@

          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body" id="add-job-container">
        
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary">Save changes</button>
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>
@section Scripts
{ 
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
    <script>
        $("#add-new-User-form").submit(function (e) {
            e.preventDefault();
            var $form = $(this);
            $.post($form.attr("action"), $form.serialize())
                .done(function(dt, status, req)
                {
                    $('#add-job-container').html(dt); //container
                    $('#add-job-modal').modal('show'); //modal       
                })
                .fail(function(res){
                    //ModelState is invalid 
                    //do your stuff..
                    alert(res.statusText);
                })
         });
     </script>
}

ConfirmUser.cshtml

@model UserModel
<h1>Confirm User</h1>
@Model.Name
@Model.Email

控制器:

public IActionResult AddNewUser()
{
    return View();
}
[HttpPost]
public IActionResult AddNewUser(UserModel model)
{
    if (ModelState.IsValid)
    {
        //Some TempData logic here:
        return PartialView("ConfirmUser",model);
    }
    return BadRequest();
}

结果: