【发布时间】:2012-06-14 17:37:21
【问题描述】:
我在我的项目中使用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 模板生成的 Buddy Class:
[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,我认为我已经正确设置了所有内容,即命名空间很好,所以没有发生裸露的部分类的事情。
当我的视图呈现时,我将所有文本框都留空,我设置了一个断点以按实体检查并且没有设置任何内容,但模型是有效的。我还通过在文本框中输入一些垃圾来进行测试,以确保模型绑定工作正常,而且它是...
我也尝试使用控制台应用程序进行测试,我发现您必须采取额外的步骤registering the MetaData type,但我相信在 MVC 中这不是必需的。万一它对任何人有帮助 - 控制台应用程序和注册元数据类型也对我不起作用,所以我认为我的好友班可能是罪魁祸首?
【问题讨论】:
-
在
FilingHistoryMetaData中将FilingHistoryId属性更改为public。也许框架只迭代公共的...... -
哇@nemesv 就是这样......提供这个作为答案,我会接受它,我想我只是需要更多的眼睛......:)
标签: asp.net-mvc entity-framework validation t4