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

时间:2010-03-17 16:22:08

标签: asp.net-mvc validation asp.net-mvc-2 asp.net-mvc-2-validation

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 个答案:

答案 0 :(得分:9)

我发布问题后大约五秒钟,我意识到了一些事情:我的观点在任何地方都没有ValidationMessage个占位符。我添加了<%= Html.ValidationMessageFor(model => model.Item.Name) %>并且看到,MVC将Item.Name的验证规则添加到页面底部的JS块中。

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

  1. 致电Html.ValidationMessage()获取该物业。
  2. 致电Html.Validate()了解该物业。 (这个不会输出错误消息)
  3. 使用Html.EditorForModel()渲染控件。 (source
  4. 执行上述任何操作都会告诉MVC,“我的viewmodel的此属性可由用户编辑,因此您应该对其进行验证。”只使用HTML助手将文本框粘贴在页面上 - 即使您使用新的强类型帮助程序 - 还不够。

答案 1 :(得分:-1)

我没有运气让它在MVC 2 RC中工作。根据{{​​3}}这里的SO,您必须从MVC Futures版本中获取MicrosoftMvcJQueryValidation.js文件,将您的左脚放在头后,并向Dixie吹口哨半小时。我做了这个以及更多,并且无法使其发挥作用。

希望它将在RTM中修复。