使用部分类进行验证?

时间:2011-02-03 03:52:09

标签: c# asp.net asp.net-mvc

我正在使用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.而不是我的错误消息。

我做错了什么?

3 个答案:

答案 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; }