【问题标题】:How to display Partial view Model errors when partial view is in the view?局部视图在视图中时如何显示局部视图模型错误?
【发布时间】:2018-08-10 06:02:42
【问题描述】:

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

你可以继续看我的Model、Partial view、controller和...

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 中的模型错误而不是新页面?

【问题讨论】:

  • 听起来您需要使用 AJAX POST 而不是标准表单发布来在发生验证错误时返回主视图内的部分视图(&lt;form asp-controller="Account" asp-action="Login" method="post"&gt; 创建标准 POST 表单,而不是 AJAX 表单)。
  • @TetsuyaYamamoto 能否介绍一下好的教程或示例代码?
  • 尝试将data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#formID" 添加到局部视图的表单中(并且您应该使用表单 ID 来更新表单内容)。

标签: asp.net-core asp.net-core-mvc partial-views


【解决方案1】:

这是一个标准的表单提交标签,它发送 POST 请求并按预期返回新页面:

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

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

<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脚本完成的。

【讨论】:

  • 这个 AJAX 表单不是创建一个新的局部视图,它只是用从服务器获取的新响应替换现有的局部视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多