【问题标题】:mvc3 validation when using buddy classes使用伙伴类时的 mvc3 验证
【发布时间】:2011-11-10 22:14:41
【问题描述】:

我正在开发一个 mvc3 应用程序,但在让验证按我想要的方式工作时遇到了一些问题。

应用程序正在使用模型的伙伴类。 (这是我过去没有使用过的东西,我有点困惑为什么要使用它们......无论如何)

我想添加必填字段以确保提交的数据是正确的。我已经尝试将必填字段添加到好友类。

当我提交表单时,不会进行客户端验证,并且调试器会进入实体框架生成的代码。这里抱怨包含空值的字段导致无效。如果我逐步完成所有这些,它最终会到达我的 if (ModelState.IsValid) 显示为 false 的控制器。

我开启了客户端验证。

我是要在伙伴类级别或视图模型上应用数据验证吗?

另一个问题是为什么要使用伙伴课程?对我来说,他们似乎把事情复杂化了。

更新添加了好友类的示例

[MetadataType(typeof (CustomerMetaData))]
public partial class Customer
{
    public string Priorty
    {
        get
        {
            var desc = (Priority) Priority;
            return desc.ToString().Replace('_', ' ');
        }
    }

internal class CustomerMetaData
{
    [Required]
    [DisplayName("Priorty")]
    public string Priorty { get; set; }

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    伙伴类是元数据类,用于在您无法控制原始类(即无法编辑它)时放置数据注释属性。典型的情况是当类由像实体框架这样的 ORM 生成时。

    //Can't edit this class
    public partial class YourClass{
      public string SomeField {get; set;}
    }
    
    //Add a partial class
    [MetadataType(typeof(YourClassMetadata))]
    public partial class YourClass{
    }
    
    //And a metadata class    
    public class YourClassMetadata
    {  
      [Required(ErrorMessage = "Some Field is required")]
      public string SomeField {get; set;}
    }
    

    你确定你有[MetadataType(typeof(YourClassMetadata))]吗?

    更多关于好友班herehere

    【讨论】:

    • 嗨,阿米特,谢谢,是的,它已被使用。我已经用一个使用过的例子更新了我的帖子。
    • 只是为了确保所有其他东西都正确排列,向类(和视图)添加一个 int 字段,看看 MVC 是否会抛出错误。如果不是,则验证本身有问题。
    【解决方案2】:

    当无法将元数据添加到实体类时,例如当 ORM 工具自动生成模型时,您通常会使用伙伴类。在这种情况下,您应用的任何元数据都会丢失。

    因此,您的原始(自动生成)类将被定义为部分类:

    public partial class Customer
    {
        public string Priority { get; set; }
    }
    

    然后你会生成你的伙伴类来添加元数据。

    [MetadataType(typeof(CustomerMetaData))]
    public partial class Customer
    {
    }
    
    internal class CustomerMetaData
    {
        [Required]
        public string Priority { get; set; }
    }
    

    然后,您可以将 Customer 类传递给要设置优先级的视图。

    在你的情况下,我不确定你是否只有一个或两个部分课程(因为另一个没有显示,但如果有,请提供)。我很想知道您如何从客户那里获得优先级信息,因为我想知道这是否与您使用 ModelState.IsValid 的方式有关?我问的原因是没有在 Priority 属性上声明设置访问器,所以我想知道如何从视图中设置它以报告它无效?

    【讨论】:

      【解决方案3】:

      当无法将元数据添加到实体类时,例如当模型由 WCF 数据协定自动生成时,您也可以使用伙伴类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多