ASP.NET MVC 2 клиентские правила проверки не создаются - PullRequest
3 голосов
/ 17 марта 2010

MVC не генерирует правила проверки на стороне клиента для моей модели представления. HTML просто содержит это:

<script type="text/javascript">
//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({"Fields":[],"FormId":"form0","ReplaceValidationSummary":false});
//]]>
</script>

Обратите внимание, что Fields[] пусто!

Мое представление строго типизировано и использует новые строго типизированные помощники HTML (TextBoxFor() и т. Д.).

Просмотр модели / доменной модели

public class ItemFormViewModel
{
    public Item Item { get; set; }
    [Required] [StringLength(100)] public string Whatever { get; set; } // for demo
}
[MetadataType(typeof(ItemMetadata))]
public class Item
{
    public string Name { get; set; }
    public string SKU { get; set; }
    public int QuantityRequired { get; set; }
    // etc.
}
public class ItemMetadata
{
    [Required] [StringLength(100)] public string Name { get; set; }
    [Required] [StringLength(50)] public string SKU { get; set; }
    [Range(0, Int32.MaxValue)] public int QuantityRequired { get; set; }
    // etc.
}

(я знаю, что я использую модель домена в качестве моей / как части моей модели представления, что не является хорошей практикой, но пока не обращайте на это внимания.)

View

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<ItemFormViewModel>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Editing item: <%= Html.Encode(Model.Item.Name) %></h2>

    <% Html.EnableClientValidation(); %>
    <%= Html.ValidationSummary("Could not save the item.") %>

    <% using (Html.BeginForm()) { %>

        <%= Html.TextBoxFor(model => model.Item.Name) %>
        <%= Html.TextBoxFor(model => model.Item.SKU) %>
        <%= Html.TextBoxFor(model => model.Item.QuantityRequired) %>

        <%= Html.HiddenFor(model => model.Item.ItemID) %>

        <%= Html.TextBox("Whatever", Model.Whatever) %>
    <input type="submit" value="Save" />
    <% } %>
</asp:Content>

Я включил свойство Whatever в модель представления, потому что подозревал, что MVC не рекурсивно проверяет подсвойства ItemFormViewModel.Item, но даже это не проверяется? Я даже пытался вникнуть в исходный код фреймворка MVC, но вышел пустым. Что может происходить?

Ответы [ 2 ]

9 голосов
/ 17 марта 2010

Примерно через пять секунд после того, как я опубликовал вопрос, я кое-что понял: в моем представлении нигде не было заполнителей ValidationMessage. Я добавил <%= Html.ValidationMessageFor(model => model.Item.Name) %> и вот, MVC добавил правила проверки для Item.Name в блок JS внизу страницы.

Оказывается, что MVC не выдает правила проверки на стороне клиента для поля , если вы не выполните одно из следующих действий:

  1. Звоните Html.ValidationMessage() для собственности.
  2. Звоните Html.Validate() для собственности. (Этот не выводит сообщения об ошибках)
  3. Визуализируйте элементы управления, используя Html.EditorForModel(). ( источник )

Выполнение любого из этих действий говорит MVC: «Это свойство моей view-модели редактируется пользователем, поэтому вам следует проверить его». Простого использования помощника HTML для прикрепления текстового поля на странице - даже если вы используете новых строго типизированных помощников - недостаточно.

0 голосов
/ 17 марта 2010

Мне не повезло заставить его работать в MVC 2 RC. Согласно другим вопросам здесь, на SO, вы должны получить файл MicrosoftMvcJQueryValidation.js из выпуска MVC Futures, держать левую ногу за головой и свистеть Дикси в течение получаса. Я сделал это и многое другое и не смог заставить его работать.

Надеюсь, это будет исправлено в RTM.

...