ASP.Net 核心 MVC - 验证摘要不适用于 bootstrap 选项卡和动态加载的内容

ASP.Net Core MVC - Validation Summary not working with bootstrap tabs and dynamically loaded content

如何让动态加载的选项卡在 ASP.Net Core MVC 中工作?

  1. 我有一个简单的 Index.cshtml,它使用 bootstrap 标签从页面上的 a 标签创建两个标签。 (为了测试选项,我首先从 https://qawithexperts.com/article/asp.net/bootstrap-tabs-with-dynamic-content-loading-in-aspnet-mvc/176 复制)
  2. 每个选项卡上都有一个点击事件,使用$.ajax()调用控制器,然后设置相应的div.[=38=的html ]
  3. 我有一个只有一个字段的模型,一个字符串是必需的。
  4. 我有 Visual Studio 创建的创建视图。
  5. 当我 运行 它并单击第一个选项卡时,控制器 returns PartialView("FirstTabCreate") 并加载到 div 中,一切看起来都很棒。
  6. 问题出在单击“创建”按钮时。
  7. 控制器方法检查 ModelState 上是否为 IsValid。如果没有,这就是我 运行 遇到问题的地方。如果我 return 局部视图和传入的模型,我会按预期看到验证错误,但是因为我 return 编辑了局部视图,所以我丢失了标签。如果我 return 主视图(索引)然后 javascript 重新加载我的部分视图并在那时丢失了 ModelState。

我不确定要 return 做什么才能使其有效。我在网上看到很多使用动态加载选项卡的示例,但是 none 其中有模型或验证。

代码如下: 索引页

@model FirstTab
<!-- Tab Buttons -->
<ul id="tabstrip" class="nav nav-tabs" role="tablist">
    <li class="active">
        <a href="#FirstTab" role="tab" data-toggle="tab">Submission</a>
    </li>
    <li>
        <a href="#SecondTab" role="tab" data-toggle="tab">Search</a>
    </li>
</ul>

<!-- Tab Content Containers -->
<div class="tab-content">
    <div class="tab-pane active" id="FirstTab">
       
    </div>
    <div class="tab-pane fade" id="SecondTab">

    </div>
</div>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script>
    $('#tabstrip a').click(function (e) {
        e.preventDefault();
        var tabID = $(this).attr("href").substr(1);
        $(".tab-pane").each(function () {
            console.log("clearing " + $(this).attr("id") + " tab");
            $(this).empty();
        });

        $.ajax({
            url: "/@ViewContext.RouteData.Values["controller"]/" + tabID,
            cache: false,
            type: "get",
            dataType: "html",
            success: function (result) {
                $("#" + tabID).html(result);
            }

        });
        $(this).tab('show');
    });

    $(document).ready(function () {
        $('#tabstrip a')[0].click();
    });
</script>

FirstTabCreate 视图

@model WebApplication1.Models.FirstTab

<h4>FirstTab</h4>
<hr />
<div class="row">
    <div class="col-md-4">
       <form asp-action="FirstTabCreate">        
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="FirstName" class="control-label"></label>
                <input asp-for="FirstName" class="form-control" />
                <span asp-validation-for="FirstName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

型号

using System.ComponentModel.DataAnnotations;

namespace WebApplication1.Models
{
    public class FirstTab
    {
        [Required()]
        public string FirstName { get; set; }
    }
}

控制器

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {       
        public IActionResult Index()
        {
            return View();
        }

        public ActionResult FirstTab()
        {
            return PartialView("FirstTabCreate");
        }

        public ActionResult FirstTabCreate(FirstTab model)
        {
            if (!ModelState.IsValid)
            {
                return View("FirstTabCreate",  model);
            }
            return Content("Success");
        }

        public ActionResult SecondTab()
        {
            return PartialView("_SecondTab");
        }
    }
}

尝试在您的代码中添加 jquery 验证脚本 删除这个

<script src="~/lib/jquery/dist/jquery.min.js"></script>

并改用它

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

我不喜欢它,但为了让它正常工作,当我单击“保存”时,我在控制器方法中检查 ModelState 是否有效。如果没有,我将键和值放入自定义 class 列表中,然后将该列表放入缓存中。当加载子部分视图时,它会检查缓存中是否有任何内容,如果有,则将其解析出来并使用 ModelState.AddModelError().

它不是很漂亮,但它确实允许验证工作。

将以下代码添加到您的@section 脚本

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
<script>
    $.validator.setDefaults({ 
        ignore: [] 
    });
</script>

}

注意:不要在$(document).ready()

里面添加上面的内容