Ненавязчивая проверка на стороне клиента в MVC4 не работает

У меня есть страница макета со всеми скриптами, как показано ниже.

<!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;}
}

где каждое свойство также является модельным классом со своими собственными 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] Controller. Почему это не дает мне сообщения о проверке на стороне клиента, я думаю, что это называется ненавязчивой валидацией? Я также не вижу ошибок в консоли.

Ответ 1

Кнопка "Отправить" должна быть типа "submit", чтобы активировать проверку правильности проверки 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
      );
});

Ответ 2

Я думаю, вам нужно изменить порядок ссылок на скрипты

<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>

Ответ 3

если вы используете _Layout.cshtml, удалите следующую ссылку

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

внизу

которые работают для меня!

Ответ 4

У меня также была аналогичная проблема, которая потребовала нескольких недель для отладки. Я использовал страницу aspx.

Основная причина заключалась в том, что оператор Html.BeginForm был помещен после тега <table>.

<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>
<% } %>

Ответ 5

У меня была та же проблема, и я обнаружил, что если я позвоню   'Element.valid()' перед вызовом библиотеки для проверки работоспособности функции, чем она больше не будет проверять мою форму. Я решил это, создав расширение, которое проверяет, была ли форма обработана и только, чтобы проверить, действительно ли элемент

 $.fn.revalidate = function () {
        if (this.length) {
            var validator = this.closest("form").data("validator");
            if (validator)
                validator.element(this);
        }
        return this;
    };

Ответ 6

Вам также необходимо добавить сообщения об ошибках

@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)