我一直在开发一个使用asp.net mvc和nhibernate的web应用程序。我试图遵循一些DDD原则和Asp.Net MVC的最佳实践。我的问题是关于使用VIewModels清理POST。为了说明我的问题,看在我的域模型这个实体:ViewModel POST和DomainModel验证
[Validator(typeof(EntityValidator))]
public class MyEntity {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Email { get; set; }
public virtual decimal UnitPrice { get; set; }
public virtual Category Category { get; set; }
public MyEntity() { }
}
它与NHibernate映射和工作正常。为了验证,我用流利的验证,我有这个类:
public class EntityValidator : AbstractValidator<MyEntity>
{
protected IEntityRepository EntityRepository { get; set; }
public EntityValidator(IEntityRepository entityRepository) { // injected by a IoC Container
this.EntityRepository = entityRepository;
RuleFor(x => x.Name).NotEmpty();
RuleFor(x => x.UnitPrice).GreaterThan(0);
RuleFor(x => x.Category).NotNull();
RuleFor(x => x.Email).NotEmpty().EmailAddress().Must((entity, email) => EntityRepository.ExisteEmail(entity.Email));
}
}
我preffer使用流利的验证比数据注释,因为它更灵活,正常工作与Asp.Net MVC。它的配置和工作正常。所以,我有这样的视图模型:
public class EntityViewModel {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public decimal UnitPrice { get; set; }
public int IdCategory { get; set; }
}
现在,我试图做一个视图模型,使我的实体的清理POST在某些操作(如INSERT,UPDATE),因为我使用NHibernate。我
不知道是否正确创建viewmodel的验证,因为我有我自己的实体,所以,我该怎么做?你是如何做
要发布您的实体上的行动来坚持它?如何验证它并在MVC的ModelState上发布错误?
我想看看如何做到这一点的代码,如果可能的话。
谢谢大家!
感谢Darin,我也一直在使用automapper,但现在我有两个adicional问题。 1)我已经在第一个代码中看到,您在ModelState中添加了一个名为“Key”的键,您将如何在View上显示它?2)如果我们使用automapper,如何配置automapper将IdCategory转换为Category对象?非常感谢你! –
@Felipe,关于你的第一个问题,键应该用你想突出显示的字段的名称替换,或者如果它不存在,你仍然可以使用ValidationSummary助手来显示所有错误,或者你可以从模型状态错误并将其显示在视图上。关于你的第二个问题,我没有看到你如何将一个整数转换为一个Category对象。不应该你的视图模型有这个类别的附加属性而不是一个单一的ID? –
我一直在使用ViewBag为用户创建一个类别组合,选择类别并传递类别的标识以发布操作。我的域模型在属性中使用了一个Category对象。那么,我不知道这是不是一个好的approuch,但你建议如何使用这样的复杂属性?我认为原始类型对ViewModels更好。 –