部分视图在视图中时如何显示部分视图模型错误?

How to display Partial view Model errors when partial view is in the view?

我正在处理 Asp.net Core 2.0 项目,并且有一个 partial view 显示在 index 视图中。此 partial view 的模型存在一些验证错误。

您可以继续查看我的模型、局部视图、控制器和...

LoginViewModel

public class LoginViewModel
{
    [Display(Name = "UserName")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please Enter UserName")]
    public string UserName { get; set; }

    [Display(Name = "Password")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Please Enter Password")]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember Me")]
    public bool RememberMe { get; set; }
}

我在 _loginpartialView 中将 LoginViewModel 用作 model。还有 asp-validation-for 在每个 input

之后显示验证错误

_loginpartialView.cshtml

@model partialView.Models.LoginViewModel

    <div id="login">
        <span class="header-lastnews">Login</span>
        <div class="hr"></div>

        <form asp-controller="Account" asp-action="Login" method="post">


            <div class="form-group">
                <label asp-for="UserName" class="col-sm-4 control-label"></label>
                <div class="col-sm-8">
                    <input asp-for="UserName" class="form-control" />
                    <span asp-validation-for="UserName" class="text-danger"></span>
                </div>
            </div>


            <div class="form-group">
                <label asp-for="Password" class="col-sm-4 control-label"></label>
                <div class="col-sm-8">
                    <input asp-for="Password" class="form-control" />
                    <span asp-validation-for="Password" class="text-danger"></span>
                </div>
            </div>

            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <div class="checkbox">
                        <label asp-for="RememberMe">
                            <input asp-for="RememberMe" />
                            @Html.DisplayNameFor(m => m.RememberMe)
                        </label>
                    </div>
                </div>
            </div>

            <div class="row" style="width: 100%">
                <div class="form-group pull-left ">
                    <button type="submit" class="btn btn-success">Enter</button>
                </div>
            </div>
        </form>
    </div>

我已经使用 @Html.Partialindex 中渲染和显示 partial view 注意 index 视图位于 HomeController

Index.cshtml

@{
     ViewData["Title"] = "Home Page";
}

@Html.Partial("_loginpartialView")

最后这是我的 AccountController

账户控制器

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        if (ModelState.IsValid)
        {
            //Success Login
            //do Something
        }
        else
        {
            //if ModelState is invalid
            return PartialView("_loginpartialView", model);
        }

        //if UserName Or Password is incorrect
        return PartialView("_loginpartialView", model);
    }

但问题是,当我在没有输入输入值的情况下单击 submit 按钮时,会打开一个新页面并在新页面上显示 partial view 和模型错误。 我如何在同一视图而不是新页面中显示 partial view 中的模型错误?

这是一个标准的表单提交标签,它发送 POST 请求和 return 预期响应的新页面:

<form asp-controller="Account" asp-action="Login" method="post">

由于您希望 return 部分查看验证错误的同一页面,您必须使用基于 AJAX 的表单。您可以将上面的标准表单提交转换为基于 AJAX 的表单,该表单在同一主视图中显示 return 的部分视图,如下例所示:

<form id="partialform" asp-controller="Account" asp-action="Login" data-ajax="true" data-ajax-update="#partialform" data-ajax-mode="replace">
    <!-- form inner elements here -->
</form>

您应该记住的最重要的事情:

  1. data-ajax="true" 必须存在以确保表单接受 AJAX 数据。

  2. 设置 id 属性并将该 ID 值提供给 data-ajax-update 属性 以便 AJAX 回调后面的 jQuery 选择器识别它.

  3. data-ajax-mode="replace" 设置为在 AJAX success 结果之后替换先前的表单元素及其内部元素以响应服务器。

注意:data-ajax-mode="replace" 替换表单内部元素是由后台运行的 jquery.unobtrusive-ajax.js 脚本完成的。