Справка по проверке на стороне клиента ASP.NET MVC3

Я использую ненавязчивую проверку на стороне клиента для моего текущего приложения, но проблема в том, что она проверяет не все поля, а только некоторые из них. Сначала я подумал, что DropDownLists были пропущены валидатором, но после изменения их для простых текстовых полей я понял, что это тоже не работает. Я действительно не знаю, что это такое. Итак, я надеюсь, что вы можете дать мне руку:

У меня уже есть в моем Web.Config:

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

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

[MetadataType(typeof(QuestionMetadata))]
public partial class Question
{
    [Bind(Exclude = "Id")]
    public class QuestionMetadata
    {
        [Required]
        public string Text { get; set; }

        [Required]
        [DisplayName("Question Type")]
        public int QuestionType_Id { get; set; }

        [Required]
        [DisplayName("Category")]
        public int Category_Id { get; set; }

        [Required]
        [Range(1,Int32.MaxValue)]
        public int SortOrder { get; set; }
    }
}

Наконец, ViewCode: (строгий тип и получает ViewModel)

<asp:Content ID="Content2" ContentPlaceHolderID="JsContent" runat="server">
   <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>
   <script src="<%: Url.Content("~/Scripts/question-views.js") %>" type="text/javascript"></script>
</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<h2 class="path"><%= ViewRes.Question.Create.PathCreate %></h2>

    <% using (Html.BeginForm()) { %>
        <%: Html.ValidationSummary(true) %>
            <div>
               <%: ViewRes.Question.Create.DropDownQuestionnaires %>
               <%: Html.DropDownList("Questionnaire_Id", Model.questionnairesList, "--Select--")%>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.question.Category_Id)%>
            </div>            
            <div class="editor-field">
                <%: Html.DropDownListFor(model => model.question.Category_Id, Model.categoriesList, "--Select--")%>
                <%: Html.ValidationMessageFor(model => model.question.Category_Id)%>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.question.QuestionType_Id)%>
            </div>
            <div class="editor-field">
                <%: Html.DropDownListFor(model => model.question.QuestionType_Id, Model.questionsTypeList, "--Select--")%>
                <%: Html.ValidationMessageFor(model => model.question.QuestionType_Id)%>
            </div>

            <div class="editor-field">
                <%: Html.EditorFor(model => model.question.Text)%>
            </div>            

            <div class="editor-label">
                <%: Html.LabelFor(model => model.question.SortOrder)%>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.question.SortOrder)%>
                <%: Html.ValidationMessageFor(model => model.question.SortOrder)%>
            </div>

            <p>
                <input type="submit" value="<%: ViewRes.Shared.CreateButton %>" />
            </p>
    <% } %>

</asp:Content>

Спасибо за любую помощь.


person met.lord    schedule 06.07.2011    source источник
comment
Код, сгенерированный для полей, не проверяемых должным образом: code ‹div class=editor-label› ‹label for=question_Category_Id›Category/label› ‹/div› ‹div class=editor-field› ‹select id=question_Category_Id name=question.Category_Id ›‹option value=›--Select--‹/option› ‹option value=›‹/option› ‹/select› ‹span class=field-validation-valid data-valmsg-for=question.Category_Id data-valmsg- replace=true›‹/span› ‹/div›   -  person met.lord    schedule 07.07.2011
comment
Код, сгенерированный для полей, не проверяемых должным образом: code ‹div class=editor-label› ‹label for=question_QuestionType_Id›Question Type‹/label› ‹/div› ‹div class=editor-field› ‹select id=question_QuestionType_Id name=question. QuestionType_Id›‹option value=›--Select--‹/option› ‹option value=1›Выбор ответов‹/option› ‹option value=2›Текстовые ответы‹/option› ‹/select› ‹span class=field- допустимые данные-valmsg-for=question.QuestionType_Id data-valmsg-replace=true›‹/span› ‹/div›   -  person met.lord    schedule 07.07.2011
comment
Похоже, что и вопрос, и категория не проверяются, правильно (я думал, вы где-то сказали, что один из них проверяется... Вот что должно быть сгенерировано для выбора (обязательное и числовое): ‹выберите имя =CourseID id=CourseID data-val-required=Поле CourseID является обязательным data-val-number=Поле CourseID должно быть числом data-val=true class=input-validation-error›‹option value=›Выбрать ...‹/option› Ваш класс Question является частичным... это предполагает, что у вас есть другой файл (вероятно, сгенерированный EF), который имеет те же значения, что и ваш класс метаданных...   -  person Felix    schedule 07.07.2011
comment
Да, вопрос является частичным классом, поскольку с помощью LINQ создается еще один класс. Но я по-прежнему не вижу никакой ошибки... Я имею в виду, я знаю, что сгенерированный код неверен, но я не понимаю, почему это происходит. Ты знаешь почему?   -  person met.lord    schedule 08.07.2011


Ответы (3)


Вы пытались сделать свои свойства обнуляемыми? public int? Category_Id { get; set; }

person bmosh    schedule 06.07.2011
comment
Почему? Я не понимаю, как это может помочь. Во всяком случае, я пытался, и ничего не произошло... Есть другие идеи? - person met.lord; 07.07.2011
comment
У меня была проблема, когда, если я не сделаю его обнуляемым, он отправляет 0 для int, поэтому требуемый валидатор никогда не срабатывает, поскольку он всегда получает значение. - person bmosh; 07.07.2011
comment
Поскольку вы используете ненавязчивый javascript, включили ли вы файл jquery.validate.unobtrusive.min.js? - person bmosh; 07.07.2011
comment
Я понимаю. Спасибо за совет. Однако моя проблема здесь с двумя выпадающими списками, которые не проверяются. Если вы снова просмотрите код, вы заметите, что есть два DDL: Question_Id и Category_Id, оба они объявлены как требуемые в метаданных, но тем не менее валидатор не работает с ними должным образом. знак равно - person met.lord; 07.07.2011
comment
Я попробовал то, что ты мне сказал. Сделал поле обнуляемым, а затем изменил раскрывающийся список для текстового поля. При этом он проверяет поле по мере необходимости, если я использую раскрывающееся меню, это не так. - person met.lord; 07.07.2011

Вы вставляете основной скрипт Jquery в свой макет?

<script src="<%: Url.Content("~/Scripts/jquery-1.5.1.min.js") %>" type="text/javascript"></script>

вы также можете использовать Firebug, чтобы увидеть, возникает ли ошибка сценария во время проверки.

person matmat    schedule 06.07.2011
comment
Да, я вставил его на главную страницу. Любые другие предложения? - person met.lord; 07.07.2011

Взгляните на сгенерированный HTML. Для всех полей, которые будут проходить проверку на стороне клиента, вы увидите что-то вроде

<input class="text-box single-line" data-val="true" data-val-required="The Text field is required." id="Text" name="Text" type="text" value="blah-blah" /&gt;
<span class="field-validation-valid" data-valmsg-for="Text" data-valmsg-replace="true"></span>

Тогда проще устранить неполадки: проблема заключается в том, что код проверки не генерируется, или проверка не происходит, или (как в вашем примере с текстовым полем, проверка происходит, но вы нет Html.ValidationMessage(), поэтому ошибка никогда не появляется...

person Felix    schedule 06.07.2011
comment
Привет! Я использую Html.ValidationMessageFor(). Это работает для большинства полей, но иногда это не так. Код HTML не генерируется должным образом, как вы сказали, но почему? Я не знаю... - person met.lord; 07.07.2011
comment
можно подробнее? для кода, который не сгенерирован должным образом - какой код сгенерирован? Что у вас есть для этого элемента в классе модели (какие атрибуты dataannotations)? - person Felix; 07.07.2011
comment
Я уже опубликовал сгенерированный код, а также модель проверки. - person met.lord; 08.07.2011