代码之家  ›  专栏  ›  技术社区  ›  Brant Bobby

未创建ASP.NET MVC 2客户端验证规则

  •  3
  • Brant Bobby  · 技术社区  · 15 年前

    MVC没有为我的ViewModel生成客户端验证规则。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.
    }
    

    (我知道我在使用域模型 作为我的/作为我的一部分 视图模型,这不是一个好的实践,但现在不要考虑它。)

    视图

    <%@ 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 回复  |  直到 15 年前
        1
  •  9
  •   Brant Bobby    15 年前

    在我发帖五秒钟后,我意识到了一件事:我的观点没有 ValidationMessage 占位符。我补充说 <%= Html.ValidationMessageFor(model => model.Item.Name) %> 你瞧,MVC为 Item.Name 页面底部的js块。

    事实证明,mvc不会为字段发出客户端验证规则。 除非 实际上,您可以执行以下操作之一:

    1. 呼叫 Html.ValidationMessage() 为了财产。
    2. 呼叫 Html.Validate() 为了财产。(此项不会输出错误消息)
    3. 使用渲染控件 Html.EditorForModel() . ( source )

    执行任何这些操作都会告诉mvc,“用户可以编辑我的viewmodel的属性,因此您应该验证它。”仅仅使用html助手在页面上粘贴文本框(即使您使用的是新的强类型助手)是不够的。

        2
  •  -1
  •   Community CDub    8 年前

    我没能在mvc 2 rc中使用它。根据 other questions 在这里,您必须从MVC Futures发行版中获取microsoftMVCjQueryValidation.js文件,将左脚放在脑后,并吹半个小时的口哨。我做了这么多,却没能成功。

    希望能在rtm中修复。