11

我有所有脚本的布局页面,如下所示。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>My Site</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <some custom css>
    <modernizr>
    <script src="~/Scripts/Jquery/jquery-1.9.1.js"></script>
    <script src="~/Scripts/Jquery/jquery-ui-1.10.2.js"></script>
    <script src="~/Scripts/Jquery/jquery.unobtrusive-ajax.js"></script>
    <script src="~/Scripts/Jquery/jquery.validate.js"></script>
    <script src="~/Scripts/Jquery/jquery.validate.unobtrusive.js"></script>
    <some custom scripts>
    <bootstrap scripts>
    <knockout scripts>           
</head>
<body>
  @RenderBody()
</body>
</html>

然后我有我的注册表,如图所示

@model Mysite.Models.Account.Account
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "register" }))
{
 @Html.AntiForgeryToken();
 <h1>Login</h1>
 @Html.ValidationSummary();
 @Html.EditorFor(m => m.Name)
 @Html.EditorFor(m => m.Address1)
 @Html.EditorFor(m => m.Address2)
 @Html.EditorFor(m => m.Phone1)
<input type="button" value="Register" id="btn1" />
}
<script>
var form = $("#register");
 $("#btn1").click(function (e) {
        e.preventDefault();
        $.ajax({
            url: 'http://localhost:3885/Account/Register',
            data: form.serialize(),
            type: 'POST',
            success: function (result) {},
            error: function (req, status, error) {
                function(req, status, error);
            }
        });
    });
</script>

我的帐户模型类如下:

public class Account
{
   public Name name {get; set;}
   public Address Address1 {get; set;}
   public Address Address2 {get; set;}
   public Phone Phone1 {get;set;}
}

例如,其中每个 Property 也是一个具有自己的 EditorTemplates 的模型类

public class Name
{
   [Required]
   public string FirstName {get; set;} 
   public string MiddleName {get; set;}
   [Required]
   public string LastName {get; set;}
}

并有 Name.cshtml EditorTemplate 如下

<div >
 @Html.TextBoxFor(m=>m.FirstName);
 @Html.TextBoxFor(m=>m.MiddleName);
 @Html.TextBoxFor(m=>m.LastName);
<div>

Address.cshtml 和 Phone.cshtml 类似

在 web.config 中:-

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

单击空表单上的注册按钮时,它会通过 ajax 发布到注册 [HttpPost] 控制器方法。为什么它不给我客户端验证消息,我认为它称为不显眼的验证?我也没有在控制台中看到任何错误。

4

6 回答 6

25

提交按钮必须是“提交”类型以触发 jquery 验证验证,无论是单独使用 jquery 插件还是与不显眼的插件一起使用。

所以这会触发验证:

<input type="submit" value="Register" id="btn1" />

但是由于您已经编写了一些代码来处理按钮单击,因此手动触发验证可能更容易

$("#btn1").click(function (e) {

      e.preventDefault();

      // now trigger the form validation, result is 1 or 0
      var result = $('form').valid();  

      $.ajax(
         // details omitted
      );
});
于 2013-05-21T20:21:43.600 回答
4

我认为您需要重新排序脚本参考

<script src="~/Scripts/Jquery/jquery-1.9.1.js"></script>
    <script src="~/Scripts/Jquery/jquery-ui-1.10.2.js"></script>
    <script src="~/Scripts/Jquery/jquery.validate.js"></script>
    <script src="~/Scripts/Jquery/jquery.validate.unobtrusive.js"></script>
    <script src="~/Scripts/Jquery/jquery.unobtrusive-ajax.js"></script>
于 2013-05-21T19:45:47.067 回答
1

如果您使用的是 _Layout.cshtml,请删除以下参考

@Scripts.Render("~/bundles/jquery")

在底部

那对我有用!

于 2014-04-03T03:40:04.830 回答
0

我也有类似的问题,需要几周的时间来调试。我正在使用 aspx 页面。

根本原因是该Html.BeginForm语句放置在<table>tag之后。

<table>
   <% using (Html.BeginForm("ContainerManagement", "Admin", FormMethod.Post)){%>
</table>

这导致<form>标签在任何标签之前关闭<input>,因此不显眼的客户端验证不起作用。

<form action="/Admin/ContainerManagement" method="post" novalidate="novalidate"></form> <tr> <td><input></td> </tr>

所以,记得放在标签Html.BeginForm 之前 <table>

<% using (Html.BeginForm("ContainerManagement", "Admin", FormMethod.Post)){%>
<table>...</table>
<% } %>
于 2015-02-09T10:03:43.550 回答
0

您还需要添加错误消息

@Html.EditorFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)

 @Html.EditorFor(m => m.Address1)
@Html.ValidationMessageFor(m => m.Address1)

 @Html.EditorFor(m => m.Address2)
@Html.ValidationMessageFor(m => m.Address2)

 @Html.EditorFor(m => m.Phone1)
@Html.ValidationMessageFor(m => m.Phone1)
于 2013-05-21T20:06:37.690 回答
0

我遇到了同样的问题,发现如果我在库调用验证函数之前调用“element.valid()”,它将不再验证我的表单。我通过创建一个扩展来解决这个问题,该扩展验证表单是否已被处理,并且仅验证元素是否有效

 $.fn.revalidate = function () {
        if (this.length) {
            var validator = this.closest("form").data("validator");
            if (validator)
                validator.element(this);
        }
        return this;
    };
于 2015-10-29T13:08:32.643 回答