【问题标题】:Using partial classes for validation?使用部分类进行验证?
【发布时间】:2011-02-03 03:52:08
【问题描述】:

我正在使用实体框架来创建我的数据对象。这是我的 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. 而不是我的错误消息。

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    您的方法存在根本缺陷。一般认为,将数据库对象用作视图模型并让 Mvc 对其进行模型绑定是一个非常糟糕的主意。

    Darin 有一个great answer 详细说明与在视图中使用域对象相关的问题。

    我认为您的问题是由于您将数据对象与视图模型混合在一起而引起的,并引用 Darin

    大约 60% 的问题我是 [Darin] 在 StackOverflow 上回答 asp.net-mvc 标签不会是 询问OP是否使用了视图 型号。

    【讨论】:

    • 我同意使用视图模型是可行的方法 - 但是否仍然可以对业务对象本身进行验证?视图模型最终包装了这些相同的属性,我认为将验证放在一个位置(靠近数据库)比在可能的多个以 UI 为中心的实现中复制它更好。
    【解决方案2】:

    我不确定你是否可以有一个局部类然后有另一个嵌套类的局部类。尝试让您声明的部分不是嵌套类。

    编辑: 刚刚在 VS 中运行了一个快速测试(不是验证部分),你不能将部分类的一部分放在嵌套类型中,而将部分类的另一部分作为非嵌套类型(或嵌套在不同类型中) .

    【讨论】:

      【解决方案3】:

      我在这里可能不正确,但我相信Required 属性仅表示“非空”,而您的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; } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多