使用好友类时的mvc3验证

时间:2011-11-10 22:14:42

标签: asp.net-mvc-3

我正在开发一个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; }

3 个答案:

答案 0 :(得分:1)

Buddy类是元数据类,用于在您不控制原始类时放置数据注释属性,即无法编辑它。典型情况是类是由像Entity Framework这样的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

的详情

答案 1 :(得分:0)

当无法将元数据添加到实体类时(例如,当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属性上没有声明set访问器,所以我想知道如何从视图中设置它以报告它无效?

答案 2 :(得分:0)

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