我在我的项目中使用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这不是必需的。万一它可以帮助任何人 - 控制台应用程序和注册元数据类型也不适合我,所以我认为我的好友类可能是罪魁祸首?
答案 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
}