Bra*_*bby 3 validation asp.net-mvc asp.net-mvc-2-validation asp.net-mvc-2
MVC没有为我的viewmodel生成客户端验证规则.HTML只包含这个:
<script type="text/javascript">
//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({"Fields":[],"FormId":"form0","ReplaceValidationSummary":false});
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)
注意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.
}
Run Code Online (Sandbox Code Playgroud)
(我知道我正在使用域模型作为我的/作为我的视图模型的一部分,这不是一个好习惯,但暂时忽略它.)
<%@ 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>
Run Code Online (Sandbox Code Playgroud)
我Whatever在视图模型中包含了属性,因为我怀疑MVC没有递归地检查子属性ItemFormViewModel.Item,但即使没有验证?我甚至尝试深入研究MVC框架源代码,但是空洞了.会发生什么事?
在我发布问题后大约五秒钟,我意识到了一些事情:我的观点在ValidationMessage任何地方都没有占位符.我添加<%= Html.ValidationMessageFor(model => model.Item.Name) %>并且看到,MVC Item.Name在页面底部的JS块中添加了验证规则.
事实证明,除非您实际执行以下操作之一,否则 MVC不会为字段发出客户端验证规则:
Html.ValidationMessage()财产.Html.Validate()财产.(这个不会输出错误信息)Html.EditorForModel().(来源)执行上述任何操作都会告诉MVC,"我的viewmodel的此属性可由用户编辑,因此您应该对其进行验证." 只使用HTML助手将文本框粘贴在页面上 - 即使您使用新的强类型帮助程序 - 还不够.