Asp.Net MVC EnableClientValidation не работает

Я хочу, а также проверку на стороне клиента как подтверждение на стороне сервера. Я понял это как следующее:

Модель: (Модель имеет DataModel (dbml), который содержит класс Test)

namespace MyProject.TestProject
{
    [MetadataType(typeof(TestMetaData))]
    public partial class Test
    {

    }

    public class TestMetaData
    {
        [Required(ErrorMessage="Please enter a name.")]
        [StringLength(50)]
        public string Name { get; set; }
    }
}

Контроллер ничего особенного.

Вид:

<% Html.EnableClientValidation(); %>
<% using (Ajax.BeginForm("Index", "Test", FormMethod.Post, 
            new AjaxOptions {}, new { enctype = "multipart/form-data" }))
   {%>
   <%= Html.AntiForgeryToken()%>
    <fieldset>
        <legend>Widget Omschrijving</legend>
        <div>
            <%= Html.LabelFor(Model => Model.Name) %>
            <%= Html.TextBoxFor(Model => Model.Name) %>
            <%= Html.ValidationMessageFor(Model => Model.Name) %>
        </div>
    </fieldset>
    <div>
        <input type="submit" value="Save" />
    </div>
 <% } %>

Чтобы сделать все это, я добавил ссылки на файлы js:

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
<script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>

В конце концов, он должен работать, но он не работает на 100%: Он выполняет проверку без обновления страницы после нажатия кнопки. Он также выполняет "половину" проверки на стороне клиента. Только когда вы введете текст в текстовое поле и затем отмените введенный текст. Появится проверка на стороне клиента. Но когда я пытаюсь это сделать, нажав между элементами управления, нет проверки на стороне клиента.

Я пропустил какую-то ссылку или что-то в этом роде? (Я использую RTM от Asp.Net MVC 2)

Ответы

Ответ 1

Измените порядок загруженного javascript...

<script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

Имел ту же самую проблему, и это очистило меня для меня...

Ответ 2

Я думал, что тоже чего-то не хватает, но я знаю, что подключаемый модуль проверки jQuery не реагирует на mouseEnter/mouseLeave. В соответствии с документацией для этого подключаемого модуля (на странице подключить страницу - найдите раздел с надписью "Несколько вещей, которые нужно искать при игре с демо" ):

Прежде чем поле будет помечено как недопустимое, проверка будет ленивой: перед отправкой формы в первый раз пользователь может вставлять поля без получения раздражающих сообщений - он не будет прослушиваться, прежде чем у него появится возможность фактически войти правильное значение

Я предполагаю, что это же правило с проверкой на стороне клиента MVC 2. Я не могу быть уверен в этом, потому что документация ничего не говорит, но "она работает на моей машине":).

Я пошел с маршрутом проверки jQuery, который поддерживается в MVC Futures (обратите внимание, что документация потому что этого не существует). Чтобы использовать его, вам просто нужно заменить теги script для файлов MicrosoftAjax.js, MicrosoftMvcAjax.js и MicrosoftMvcValidation.js двумя этими тегами:

<script src="/js/jquery.validate.js" type="text/javascript"></script>
<script src="/js/MicrosoftMvcJQueryValidation.js" type="text/javascript"></script>

заменив путь вашим.

Я также нашел необходимость обновить до последней версии jquery.validate.js на странице разработчика, потому что здесь мы используем более позднюю версию jQuery (1.4).

Надеюсь, что это поможет.

Ответ 3

hm..., поздно ответить, но попробуйте следующее:

<script src="<%= Url.Content("ScriptFile.js") %>" type="text/javascript"></script>