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

3
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.
}

我知道我正在使用领域模型作为我的视图模型的一部分,这不是一个好的做法,但现在请忽略这点。

视图

<%@ 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
大约在我发出问题后的五秒钟,我意识到了一些事情:我的视图里没有任何 ValidationMessage 占位符。我添加了 <%= Html.ValidationMessageFor(model => model.Item.Name) %> ,MVC 在页面底部的 JS 块中为 Item.Name 添加了验证规则。
原来 MVC 不会为一个字段发出客户端验证规则,除非你实际执行以下操作之一:
  1. 调用属性的 Html.ValidationMessage()
  2. 调用属性的 Html.Validate()。(这种方式不会输出错误消息)
  3. 使用 Html.EditorForModel() 渲染控件。(source)
执行任何一项操作都会告诉 MVC,“这个视图模型的属性是可由用户编辑的,所以你应该对它进行验证。” 只是使用 HTML 辅助工具将文本框粘贴到页面上——即使你正在使用新的强类型辅助工具——也不够。

当你的回答出现时,我已经打好了我的答案。EnableClientValidation只是通过启用FormContext为客户端验证设置ViewContext。只有在使用显示或验证特定字段的方法之一时,才会将字段添加到FormContext中。这使您可以同时在不同字段上进行客户端或服务器端验证。如果仅通过在表单中包含它来注册字段进行验证,则情况将不同。 - tvanfosson
关键部分还包括注册您的验证器。当我没有这样做时,我一直在想。Global.asax :: Application_Start.添加此语句。DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ItemFormatAttribute), typeof(ItemFormatValidator)); - cdpnet

-1

我在MVC 2 RC中无法让它工作。根据SO上的其他问题,您必须从MVC Futures发布中获取MicrosoftMvcJQueryValidation.js文件,将左脚放在头后面,吹响半个小时的迪克西口哨。我做了这个和更多的事情,但无法让它工作。

希望在RTM中能够修复它。


我已经引用了必要的JS。问题在于MVC框架没有发出定义客户端应用于表单的验证规则的JSON。我正在使用RTM版本。 - Brant Bobby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接