如何使这个ASP.NET核心模型验证在客户端工作?

时间:2017-09-01 22:14:40

标签: asp.net-core model-validation

在我的ASP.NET Core 1.1.1应用中,以下Model Validation无效。我认为这个问题与我在下面的主视图中没有正确添加验证脚本有关。

情景

  1. 点击主视图上的一个按钮,调用partial view
  2. 我输入所有正确的值,在部分视图中提交表单(在部分视图中),表单successfully被提交并且所有值都正确输入到SQL server db中。
  3. 我然后intentionallyprice(即nullable type float)的输入框中输入一个字符串,例如abc,然后提交表单。客户端错误甚至不会显示(我的Chrome浏览器启用了javascript)。因此,表单将被提交到服务器,其中ModeState.IsValid在POST操作方法中按预期为false
  4. 问题:为什么上面的客户端验证(如步骤3所示)不起作用以及我们如何使其工作?

    注意:创建项目时,VS2017默认添加并配置了所有css和javascripts。所以我认为脚本都在那里,我可能没有在视图上正确地调用它们 - 但这只是一个假设。

    MyViewModel

    public class MyViewModel
    {
        public int FY { get; set; } 
        public byte OrderType { get; set; }
        public float? Price { get; set; } 
        ....
    }
    

    主视图

    @model MyProj.Models.MainViewModel
    
    ...
    <div>
      <button type="submit" name="submit"...>GO</button>
    </div
    @section scripts
    {
      <script>
        $(document).ready(function () {
         ....
         $('.tab-content').on('click', '.BtnGO', function (event) {
        ....    
        $.ajax({
            url: '@Url.Action("SU_AddCustOrder", "MyContr")',
            data: { ....},
            contentType: 'application/json',
            dataType: 'html',
            type: 'GET',
            cache: false,
            success: function (data) {
                if (BtnVal == 'AddOrderBtnGo')
                    $('#menuAP').html(data);
                else if ....
            error: function (....){
                  alert(...);
            }
        });
    });
    

    MyContrController

    [HttpGet]
    public IActionResult AddCustOrder(int Order_id)
    {
     ....
     return PartialView("~/Views/PartialsV/MyPartialView.cshtml", myVM);
     ....
    }
    
    [HttpPost]
    public IActionResult AddCustOrder(MyViewModel model)
    {
     ....
     if(ModelState.IsValid)
     {
       ....
     }
     ....
    }
    

    部分视图

    ....
    <div class="form-group">
        <label asp-for="Price"></label>
        <div class="col-md-10">
            <input asp-for="Price" class="form-control"></input>
            <span asp-validation-for="Price" class="text-danger"></span>
        </div>
    </div>
    ....
    <button type="submit" name="submit"...>Add Order</button>
    

    更新

    _layout.cshtm 文件

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>@ViewData["Title"] - Test</title>
    
        <environment names="Development">
            <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
            <link rel="stylesheet" href="~/css/site.css" />
        </environment>
        <environment names="Staging,Production">
            <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
                  asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
                  asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
            <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
        </environment>
        @RenderSection("styles", required:false)
    </head>
    <body>
        <header>
            <div class="container navbar navbar-inverse navbar-fixed-top text-center">
            </div>
            <div class="container nav nav-pills" style="margin-top:4px;background-color:cornsilk;">
                @await Component.InvokeAsync("Welcome")
            </div>
        </header>
        <div class="container body-content">
            @RenderBody()
            <hr />
            <footer class="text-center">
                <a asp-controller="Misc" asp-action="AccessibilityStatement" class="text-center text-muted">Accessibility Statement</a>
            </footer>
        </div>
    
        <environment names="Development">
            <script src="~/lib/jquery/dist/jquery.js"></script>
            <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
            <script src="~/js/site.js" asp-append-version="true"></script>
        </environment>
        <environment names="Staging,Production">
            <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js"
                    asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                    asp-fallback-test="window.jQuery">
            </script>
            <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/bootstrap.min.js"
                    asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                    asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal">
            </script>
            <script src="~/js/site.min.js" asp-append-version="true"></script>
        </environment>
    
        @RenderSection("scripts", required: false)
        @RenderSection("css", required:false)
    </body>
    </html>
    

1 个答案:

答案 0 :(得分:1)

我明白了。如果您在Views文件夹中打开共享文件夹,您将找到一个名为_ValidationScriptsPartial.cshtml的文件,其中包含验证脚本。

现在要做的第一件事就是将{strong>验证属性(例如[Required])添加到您的视图模型中。

主视图@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }之前添加<script>

在此行$('#menuAP').html(data);中添加部分视图的html后,找到该表单并按以下方式调用$.validator.unobtrusive.parse()

if (BtnVal == 'AddOrderBtnGo') {
   $('#menuAP').html(data);
   var $form = $('#menuAP').find('#your-form-id-here');
   $.validator.unobtrusive.parse($form);
}