我在我的项目中使用EF4.x 自我跟踪实体,并试图在我的 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 类中排除密钥,因为它们将自动创建(仅供参考)。此外,STE、空部分和伙伴类的命名空间是相同的
当我在 MVC4 中创建一个简单的控制器只是为了测试它时,使用创建模板,在 Create 的 HttpPost 操作上,我有一些代码,如下所示:
[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,我认为我已经正确设置了所有内容,即命名空间很好,所以没有裸部分类的东西在发生。
当我的视图呈现时,我将所有文本框都留空,我设置了一个断点以按实体检查并且没有设置任何内容,但模型是有效的。我还通过在文本框中输入一些垃圾来进行测试,以确保模型绑定工作正常,而且它是......
我也尝试使用控制台应用程序进行测试,我发现您必须采取额外的步骤来注册 MetaData 类型,但我相信在 MVC 中这不是必需的。万一它对任何人有帮助 - 控制台应用程序和注册元数据类型也对我不起作用,所以我认为我的好友班可能是罪魁祸首?