这是 MVC2 和 Entity Framework 4 的问题还是设计使然?似乎 EF 属性的验证适用于日期时间不可为空(必需)的字段,并且数字与字符串字段的数据类型验证正在工作,而无需使用 ViewModel。
我在 slq 2008 中使用一个名为 barName 的单个不可为空的 varchar(50) 列使用简单的 FOOBAR 表重新创建了该问题。我从该数据库生成了 EF 模型,并快速为 FOOBAR 实体添加了一个控制器和一个 CREATE 视图。如果我尝试 POST 到 CREATE 操作而不输入属性 barName 的值,VS 会进入模型的 Designer.cs 文件中的异常(就像上面的那个)。当我尝试跳过异常时,验证消息显示在表单上,并且该字段以粉红色突出显示。
似乎某些东西没有按正确的顺序触发。因为异常发生在 VS 进入 HTTPPOST CREATE 方法之前。
我发现 ASP.Net MvcMusicStore 示例中的代码很有帮助。http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId=119336
看来绑定到 ViewModel 解决了这个问题。
namespace MvcMusicStore.ViewModels
{
public class StoreManagerViewModel
{
public Album Album { get; set; }
public List<Artist> Artists { get; set; }
public List<Genre> Genres { get; set; }
}
}
........
namespace MvcMusicStore.Models
{
[MetadataType(typeof(AlbumMetaData))]
public partial class Album
{
// Validation rules for the Album class
[Bind(Exclude = "AlbumId")]
public class AlbumMetaData
{
[ScaffoldColumn(false)]
public object AlbumId { get; set; }
[DisplayName("Genre")]
public object GenreId { get; set; }
[DisplayName("Artist")]
public object ArtistId { get; set; }
[Required(ErrorMessage = "An Album Title is required")]
[StringLength(160)]
public object Title { get; set; }
[DisplayName("Album Art URL")]
[StringLength(1024)]
public object AlbumArtUrl { get; set; }
[Required(ErrorMessage = "Price is required")]
[Range(0.01, 100.00, ErrorMessage="Price must be between 0.01 and 100.00")]
public object Price { get; set; }
}
}
}