T4自我追踪实体和模型验证

时间:2012-06-14 17:37:21

标签: asp.net-mvc entity-framework validation t4

我在我的项目中使用EF4.x Self Tracking Entities并尝试在我的MVC4 Web应用程序中实现模型验证,但是,我的模型状态似乎总是有效的。我正在使用T4模板来生成我的“伙伴”类。以下是其中一个STE及其伙伴的例子:

STE - 使用T4生成:

[DataContract(IsReference = true)]
[KnownType(typeof(Filing))]
public partial class FilingHistory: IObjectWithChangeTracker, INotifyPropertyChanged
{
   public int FilingHistoryId 
   {
     //Snipped for Brevity
   }
   // Navigation, ChangeTracking, Association Fix up snipped
}

这是通过我写的T4模板生成的好友类:

[MetadataType(typeof(FilingHistoryMetaData))]
public partial class FilingHistory
  {
    // Partial Class 
  }

public class FilingHistoryMetaData
{           
   [Display(Name = "Filing History Id")]
   [Required(ErrorMessage = "Filing History Id is Required.")]
   int FilingHistoryId { get; set; }    
   // Other properties snipped for Brevity
}

我将从每个MetaData类中排除键,因为它们将自动创建(就像fyi一样)。此外,STE,空部分和伙伴类的名称空间相同

当我在MVC4中创建一个简单的控制器只是为了测试它时,使用Create Template,在HttpPost Action的Action上我有一些代码,如下所示:

[HttpPost]
public ActionResult Create(FilingHistory filingHistoryToCreate)
 {
    if (ModelState.IsValid)  // THIS IS ALWAYS TRUE! even if i pass nothing<----
    {
            return Redirect("/");
    }

   return View(filingHistoryToCreate);
}

我通过一堆SO链接阅读,甚至通过MSDN,我认为我已经正确设置了所有内容,即命名空间很好,所以没有裸体的部分类内容。

当我的视图渲染我将所有文本框留空时,我设置了一个断点来按实体检查并且没有设置任何内容,但模型是有效的。我还通过在文本框中输入一些垃圾进行测试,以确保模型绑定工作正常,并且它是......

我还尝试使用控制台应用程序进行测试,我发现你必须采取registering the MetaData type的额外步骤,但我相信MVC这不是必需的。万一它可以帮助任何人 - 控制台应用程序和注册元数据类型也不适合我,所以我认为我的好友类可能是罪魁祸首?

1 个答案:

答案 0 :(得分:2)

DataAnnotationsModelMetadataProvider似乎在检查属性时正在寻找public属性。

将您的FilingHistoryId更改为public,它应该有效:

public class FilingHistoryMetaData
{           
   [Display(Name = "Filing History Id")]
   [Required(ErrorMessage = "Filing History Id is Required.")]
   public int FilingHistoryId { get; set; }    
   // Other properties snipped for Brevity
}