1

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

4

1 回答 1

2

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

改变你FilingHistoryIdpublic,它应该工作:

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
}
于 2012-06-14T17:59:55.450 回答