2011-02-24 3 views
5

обновление: если вы установите по крайней мере один точку останова в JavaScript, начало проверки в работах, но без него не работаетMVC 3 Client Validation работает с перебоями

обновление: добавление Jquery тега, так как это может быть связано с проверка плагин

у меня есть MVC 3 версии, System.Web.Mvc версии продукта: 3.0.20105.0 изменение 5th of Jan 2011 - я думаю, что это последнее.

Я заметил, что проверка клиента не работает, как предполагается в приложении, которое мы создаем, поэтому я сделал быстрый тест.

Я создал базовое приложение MVC 3, используя Интернет-приложение шаблон.

Я добавил контроллер Test:

using System.Web.Mvc; 
using MvcApplication3.Models; 

namespace MvcApplication3.Controllers 
{ 
    public class TestController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult Create() 
     { 
      Sample model = new Sample(); 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Create(Sample model) 
     { 
      if(!ModelState.IsValid) 
      { 
       return View(); 
      } 

      return RedirectToAction("Display"); 
     } 

     public ActionResult Display() 
     { 
      Sample model = new Sample(); 
      model.Age = 10; 
      model.CardNumber = "1324234"; 
      model.Email = "[email protected]"; 
      model.Title = "hahah"; 

      return View(model); 
     } 
    } 
} 

Модель:

using System.ComponentModel.DataAnnotations; 

namespace MvcApplication3.Models 
{ 
    public class Sample 
    { 
     [Required] 
     public string Title { get; set; } 

     [Required] 
     public string Email { get; set; } 

     [Required] 
     [Range(4, 120, ErrorMessage = "Oi! Common!")] 
     public short Age { get; set; } 

     [Required] 
     public string CardNumber { get; set; } 
    } 
} 

И 3 просмотры:

Создать:

@model MvcApplication3.Models.Sample 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@*@{ Html.EnableClientValidation(); }*@ 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(false) 
    <fieldset> 
     <legend>Sample</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Title) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Title) 
      @Html.ValidationMessageFor(model => model.Title) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Age) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Age) 
      @Html.ValidationMessageFor(model => model.Age) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CardNumber) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.CardNumber) 
      @Html.ValidationMessageFor(model => model.CardNumber) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

    @*<fieldset> 

     @Html.EditorForModel() 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 

    </fieldset> *@   
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Дисплей:

@model MvcApplication3.Models.Sample 

@{ 
    ViewBag.Title = "Display"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Display</h2> 

<fieldset> 
    <legend>Sample</legend> 

    <div class="display-label">Title</div> 
    <div class="display-field">@Model.Title</div> 

    <div class="display-label">Email</div> 
    <div class="display-field">@Model.Email</div> 

    <div class="display-label">Age</div> 
    <div class="display-field">@Model.Age</div> 

    <div class="display-label">CardNumber</div> 
    <div class="display-field">@Model.CardNumber</div> 
</fieldset> 
<p> 
    @Html.ActionLink("Back to List", "Index") 
</p> 

индекс:

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create", "Create") 
</p> 

<p> 
    @Html.ActionLink("Display", "Display") 
</p> 

Все по умолчанию здесь - Создать контроллер, AddView от действия контроллера с моделью указана с надлежащим шаблоном подмостей и использование предоставленного макета в образце приложения.

Когда я пойду в /Test/Создание клиента проверки в большинстве случаев работает только для Title и Age полей, после нажатия Создать это работает для всех полей (создание не идет к серверу).

Однако в некоторых случаях (после сборки) Title проверки не работает и Email есть, или CardNumber или Title и CardNumber но Email нет. Но никогда не все проверки работают до нажатия Создать.

Я попытался создать форму с Html.EditorForModel, а также обеспечивать проверку клиента непосредственно перед BeginForm:

@{ Html.EnableClientValidation(); } 

Я providing a source code for this sample on dropbox - а может быть, наш DEV окр сломана:/Я сделал тесты на IE 8 и Chrome 10 beta.

Только в случае, в веб конфиге сценарии проверки включены:

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

Так что мои вопросы

Есть ли способ, чтобы гарантировать, что проверка клиента будет работать, как это должно работать и не прерывисто?

Является ли это желаемым поведением, и я что-то пропускаю в конфигурации/реализации?

обновление: если вы установите по крайней мере один точку останова в JavaScript, начало проверки в работах, но без него не работает

обновление: добавление Jquery тега, так как это может быть подключен к плагину проверки

+1

это происходит со мной тоже ... любое разрешение на это ?? – cecilphillip

ответ

0

При использовании ненавязчивой проверки - проверка подлинности на стороне клиента в реальном времени работает только после первого отправки. Перед выполнением первой проверки формы на стороне клиента (просто нажмите кнопку «Отправить») проверка правильности полей не инициализируется и не работает.

+0

yup, но для некоторых полей проверка подлинности в реальном времени работает перед нажатием кнопки. Иногда это одно поле, иногда почти все поля, но не все. – Gutek

+0

downvote, потому что, хотя это правильно, проблема не в том, что OP имеет – roo2

-1

Поместите ссылки на сценарий в документ <head>. Вероятно, существует проблема с синхронизацией при выполнении сценариев и подключении проверки.

+0

, это немного помогло. Это не работает в режиме реального времени, но если я буду играть с формой достаточно долго и когда-нибудь сделаю двойное backspace в текстовом поле, я могу заставить все текстовые поля проверять. Но это все еще не решает проблему, так как мне нужно прилагать огромные усилия, чтобы пользователь мог получить информацию о проверке (слишком много усилий - щелчок, табуляция, двойное обратное пространство, удаление до тех пор, пока оно не сработает), в основном мне нужно ввести поле и добавить/delete text multiply times, чтобы вызвать это с помощью скриптов в ). – Gutek

+0

Проверка клиента основана на плагине проверки jquery. Это поведение по дизайну - «Прежде чем поле будет помечено как недействительное, проверка будет ленивой: перед отправкой формы в первый раз пользователь может вставлять поля без получения раздражающих сообщений - он не будет прослушиваться, прежде чем он шанс фактически ввести правильное значение »- http://docs.jquery.com/Plugins/validation. Он работает правильно, если нажатие кнопки submit вызывает проверку. – hwiechers

+0

ОК, но почему, чем работает для некоторых полей в начале? то есть. для Age он всегда работает перед отправкой, и пользователи получают сообщение об ошибке проверки. Это относится и к остальным полям, но он не всегда работает для одного и того же набора полей - иногда он работает только для Age перед подачей, а иногда и для Title и Age перед отправкой. И он работает для всех полей, если вы настроите точку прерывания в JS, например FireBug. Он не должен работать так - если он не должен работать перед подачей, чем он не должен, но он работает. что запутывает пользователей – Gutek