【问题标题】:asp.net mvc client side validation not working?asp.net mvc 客户端验证不起作用?
【发布时间】:2014-03-25 23:58:16
【问题描述】:

由于某种原因,我的客户端验证似乎不起作用:

这是我的html:

@using (Html.BeginForm("Create", "Home", FormMethod.Post))
{

<hr />

@Html.ValidationSummary(true)
<hr />

<p>
    <label>Select Client_ID: </label>
    <span class="field">
        <select name="clientId" id="clientId">
            @foreach (var item in Model.ClientId)
            {
                <option value="@item">@item</option>
            }
        </select>
    </span>
</p>

<p>
    <label>@Html.LabelFor(model => model.UserModel.name)</label>
    <span class="field">
        @Html.EditorFor(model => model.UserModel.name)
    </span>
    @Html.ValidationMessageFor(model => model.UserModel.name)

</p>

<p>
    <label>@Html.LabelFor(model => model.UserModel.password)</label>
    <span class="field">
        @*<input name="password" id="password" type="password" />*@
        @Html.EditorFor(model => model.UserModel.password)
    </span>
    @Html.ValidationMessageFor(model => model.UserModel.password)
</p>

<p>
    <label>@Html.LabelFor(model => model.UserModel.email)</label>
    <span class="field">
        @*<input name="email" id="email" type="email" />*@
        @Html.EditorFor(model => model.UserModel.email)
    </span>
    @Html.ValidationMessageFor(model => model.UserModel.email)
</p>

<p>
    <label>Select: </label>
    <span class="field">
        <select name="accessLevel" id="accessLevel">
            <option value="3">Company</option>
            <option value="5">End-User</option>
        </select>
    </span>
</p>

<input type="submit" value="Submit" />

这是我的模型:

 public class CreateUserModel
{
    [Required]
    [Display(Name = "Client_ID")]
    public string clientId { get; set; }

    [Required(ErrorMessage = "A name is required")]
    [MaxLength(20), MinLength(2, ErrorMessage = "Name must be 2 character or more")]
    [Display(Name = "Name")]
    public string name { get; set; }


    [Display(Name = "Email Address")]
    [Required(ErrorMessage = "Email is Required")]
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                        @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                        @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
                        ErrorMessage = "Email is not valid")]
    public string email { get; set; }

    [Required]
    [MaxLength(20), MinLength(6, ErrorMessage = "Password Must be 6 or more chataters long")]
    [Display(Name = "Password")]
    public string password { get; set; }

    [Required]
    public int accessLevel { get; set; }
}

我确实在 webconfig 中启用了客户端:

 <appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

{EDIT} 添加了渲染的 html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home Page - My ASP.NET Application</title>
<link href="/Content/bootstrap.css" rel="stylesheet"/>
<link href="/Content/site.css" rel="stylesheet"/>

<script src="/Scripts/modernizr-2.6.2.js"></script>

</head>
<body>
<script src="/Scripts/jquery.validate.js"></script>
<div class="jumbotron">
<h1>Add Users to the website</h1>
</div>
<form action="/Home/Create" method="post">    <hr />
<hr />

<p>
    <label for="UserModel_name">Name</label>
    <span class="field">
        <input type="text" name="name" />
    </span>
    <span class="field-validation-valid" data-valmsg-for="UserModel.name" data-valmsg-replace="true"></span>

</p>
<p>
    <label for="UserModel_password">Password</label>
    <span class="field">
        <input name="password" id="password" type="password" />
    </span>
    <span class="field-validation-valid" data-valmsg-for="UserModel.password" data-valmsg-replace="true"></span>
</p>
<p>
    <label for="UserModel_email">Email Address</label>
    <span class="field">
        <input name="email" id="email" type="email" />
    </span>
    <span class="field-validation-valid" data-valmsg-for="UserModel.email" data-valmsg-replace="true"></span>
</p>
<p>
    <label>Select: </label>
    <span class="field">
        <select name="accessLevel" id="accessLevel">
            <option value="3">Company</option>
            <option value="5">End-User</option>
        </select>
    </span>
</p>
<input type="submit" value="Submit" />
 </form>
    <hr />
    <footer>
        <p>&copy; 2014 - My ASP.NET Application</p>
    </footer>
</div>

<script src="/Scripts/jquery-2.1.0.js"></script>

<script src="/Scripts/bootstrap.js"></script>

【问题讨论】:

  • 你的包中是否加载了正确的 js 文件?
  • 是的,应该就是这样
  • 你能在视图/布局中显示js文件的加载顺序吗
  • 当你说“不工作”时,你能说得更具体一点吗?只有一些领域不工作吗?他们都不工作吗?是特定的验证吗? (即,Required 有效,但其他无效?)
  • 没有任何效果。当我打开页面时,没有显示验证错误,这个字段是必需的。我可以在任何地方输入任何内容,然后单击提交。

标签: c# asp.net asp.net-mvc jquery-validate unobtrusive-validation


【解决方案1】:

由于某种原因,Html 助手没有在输入中生成验证属性(data-val="true" 和其他),请检查。除了检查加载 javascript 库的顺序:

<script src="~/Scripts/jquery.js"></script>    
<script src="~/Scripts/jquery.validation.js"></script>    
<script src="~/Scripts/jquery.validation.unobtrusive.js"></script>    

【讨论】:

  • 有时会发生 如果您使用的是 CDN,请查看this。希望对某人有所帮助。
【解决方案2】:

不确定这是否是动态加载的(例如,使用 Ajax 加载部分视图)。如果是这样,那么您需要使用成功的验证器解析 html,例如 使用类似...

$.validator.unobtrusive.parse(".target");

例如

 function loadAPartialView(endPoint) {                    
                $.ajax({
                    url: endPoint,
                    type: 'GET',
                    cache: false,
                    success: function (result) {

                        $('.target').html(result);
                        $('.target').show();

                        // IMPORTANT. Next line is required to get the client side validation to run.
                        $.validator.unobtrusive.parse(".target");
                        $(".loadingMessage").hide(); 
                    },
                    error: function (result) {
                           // Error message... 
                           $(".loadingMessage").hide();

                    }
                });
            };

【讨论】:

    【解决方案3】:

    试试这个:您的验证失败,因为您在页面底部硬编码了这个 JQuery 链接版本,它可能已在您的 Scripts 文件夹中更新为较新的版本:

    <script src="/Scripts/jquery-2.1.0.js"></script>
    

    您需要做的就是转到“脚本”,查看是否有“jquery-2.1.0.js”文件或者您将 JQuery 更新到了较新的版本。输入较新版本的文件名(如果找到)并重新测试。它现在应该可以工作了。截至 2017 年 6 月,我们使用的是 JQuery 版本 3.1.1

    这发生在我身上,我一直在拔头发,直到我意识到我已经更新了 JQuery 并看到它删除了旧版本。我敢打赌那是你的问题。如果您不这样做,我建议您不要遵循在视图页面中粘贴验证脚本的视图页面模板,而是创建一个简单的用户控件或母版页或布局视图页面并将您的 JQuery 链接填充在那里,以便所有人普遍共享项目页面。浏览器会在第一次自然缓存这些页面,因此即使它们没有在其他页面上使用它们也不会再次加载。

    【讨论】:

      【解决方案4】:

      您的 jquery.validate.js 似乎位置错误。它必须在主 jquery ref 之后。

      对于 MVC 5,应该如下:

      _Layout.cshtml:(页面底部)

      <body>
      ...
      ...
      @Scripts.Render("~/bundles/jquery")
      @Scripts.Render("~/bundles/bootstrap")
      @Scripts.Render("~/bundles/jqueryval") <!-- *required for client side validation! -->
      @RenderSection("scripts", required: false)
      </body>
      

      ~/bundles/jqueryval 在 BundleConfig.cs 中定义:RegisterBundles() 方法:

      bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                  "~/Scripts/jquery.validate*"));
      

      【讨论】:

        【解决方案5】:

        用途:

        @Html.EditorFor
        

        代替:

        <input>
        

        当然你需要jquery.validate.* 脚本

        【讨论】:

          【解决方案6】:

          您的问题可能是您的文件底部有 jQuery,但您将 jquery.validate 放在了顶部。 jQuery 必须在 jQuery.validate 之前。我建议始终将 jQuery 放在您的标题中,而不是正文中,它应该是modernizr 之后的第一件事。

          另外,你知道 jQuery 2.x 不能在早期的 IE8 上工作,对吧?

          【讨论】:

          • 正如@Charlie 回答的那样,我猜这是要遵循的顺序,它对我有用,如果我在jquery.js 和jquery.validate.js 之间放置任何其他脚本文件,客户端验证不起作用。
          猜你喜欢
          • 2014-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 2013-01-09
          • 2011-11-06
          相关资源
          最近更新 更多