我正在使用Entity Framework来创建我的数据对象。这是我的designer.cs文件的样子:
namespace MyApp.WebUI.Models
{
...
[EdmEntityTypeAttribute(NamespaceName="MyAppDBModel", Name="AddressType")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class AddressType : EntityObject
{
...
}
...
}
我有一个名为Validation.cs的文件,我想在其中保留对我的实体的所有验证。这是它的样子:
namespace MyApp.WebUI.Models
{
public class Validations
{
...
[MetadataType(typeof(AddressTypesValidation))]
public partial class AddressType
{
}
public class AddressTypesValidation
{
[Required(ErrorMessage = "Address Type name is required.")]
[StringLength(50, ErrorMessage = "Address Type name must be 50 characters or less.")]
public string Name { get; set; }
}
}
}
我在浏览页面中有这个:
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm("Edit", "AddressTypes", FormMethod.Post)) { %>
<div class="editor-label"><%: Html.LabelFor(m => m.Name) %></div>
<div class="editor-field">
<%: Html.TextBoxFor(m => m.Name) %>
<%: Html.ValidationMessageFor(m => m.Name) %>
</div>
<input type="submit" value="Save" />
<% } %>
但是我的验证没有加载。如果我尝试提交没有Name值的表单,我会收到一条错误消息,指出The value '' is invalid.
而不是我的错误消息。
我做错了什么?
答案 0 :(得分:2)
您的方法存在根本缺陷。通常可以理解的是,将数据库对象用作视图模型并让Mvc对它们进行模型绑定是一个非常糟糕的想法。
Darin有great answer详细说明了与在视图中使用域对象相关的问题。
我认为您的问题是由于您将数据对象与视图模型混合在一起引起的,并引用Darin
我约有60%的问题[Darin] 回答StackOverflow中的问题 asp.net-mvc标签不会 询问OP是否使用过视图 模型。
答案 1 :(得分:0)
我不确定你是否可以拥有一个部分类,然后有另一个是嵌套类的部分类。尝试让你声明的部分不是嵌套类。
编辑: 只是在VS(而不是验证部分)中运行快速测试,并且您不能在嵌套类型中使用部分类的一部分,并将部分类的另一部分作为非嵌套类型(或嵌套在不同类型中)
答案 2 :(得分:0)
我可能不在这里,但我相信Required
属性只是意味着'not null',而你的StringLengthValidator
只是检查上限。它没有失败,因为你通过字符串发送 - 不幸的是它是String.Empty
。
您正在使用重载
[StringLength(int upperBound, [Parameters])]
相反,请尝试
[StringLength(int lowerBound, int upperBound, [Parameters])]
如果你想要最小长度为1:,那么就像这样
[Required(ErrorMessage = "Address Type name is required.")]
[StringLength(1, 50, ErrorMessage = "Address Type...")]
public string Name { get; set; }