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 框架源代码,但结果是空的。会发生什么?

4

2 回答 2

9

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

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

  1. 打电话Html.ValidationMessage()给物业。
  2. 打电话Html.Validate()给物业。(这个不会输出错误信息)
  3. 使用 渲染控件Html.EditorForModel()。(来源

做任何这些都会告诉 MVC,“我的视图模型的这个属性是用户可以编辑的,所以你应该验证它。” 仅仅使用 HTML 帮助器在页面上粘贴一个文本框——即使您使用新的强类型帮助器——是不够的。

于 2010-03-17T16:51:39.340 回答
-1

我没有运气让它在 MVC 2 RC 中工作。根据此处关于 SO 的其他问题,您必须从 MVC Futures 版本中获取 MicrosoftMvcJQueryValidation.js 文件,将左脚放在脑后,然后对 Dixie 吹口哨半小时。我做了这个以及更多,但无法让它发挥作用。

希望它会在 RTM 中得到修复。

于 2010-03-17T16:27:04.223 回答