ViewModel的POST和DomainModel的验证



我一直在使用asp.net mvc和nhibernate开发一个web应用程序。我试图遵循DDD的一些原则和Asp的最佳实践。净MVC。我的问题是关于清理POST与VIewModels。为了说明我的问题,看看我的领域模型上的这个实体:

[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映射并且工作良好。对于验证,我使用Fluent validation,我有这个类:

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));
    }
}

我更喜欢使用流畅验证而不是数据注释,因为它更灵活,与Asp一起工作得很好。净MVC。它的配置和工作也很好。因此,我有这个ViewModel:

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; }
}

现在,我试图做一个ViewModel使我的实体在一些动作(如INSERT, UPDATE)清理POST,因为我使用nhibernate。我

不知道它是否正确创建一个验证的视图模型,因为我有我自己的实体,所以,我怎么能做到这一点?你过得怎么样

POST你的实体上的动作来持久化它?你如何验证它和张贴错误对MVC的ModelState ?

如果可能的话,我想看看怎么做的代码。

谢谢大家!

不知道为视图模型创建验证是否正确,因为我有我自己的实体,那么,我怎么做呢?

我个人为我的视图模型定义了流畅的验证器。它们包含一些简单的验证规则,比如必需的属性、格式等。因此,这些验证可以直接在视图上处理。

领域模型也可以包含验证,但是那些将是业务验证。下面是POST控制器操作的通常流程:

[HttpPost]
public ActionResult Insert(UpdateViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        // the surface validation on our view model failed => redisplay the view so
        // that the user can fix errors
        return View(viewModel);
    }
    // at this stage the view model is valid => we can map it back to a domain model
    // I use AutoMapper for this:
    var domainModel = Mapper.Map<UpdateViewModel, DomainViewModel>(viewModel);
    // then we pass the domain model to the service layer for processing:
    string error;
    if (!_service.Insert(domainModel, out error))
    {
        // something wrong happened on the service layer
        ModelState.AddModelError("key", error);
        return View(viewModel);
    }
    // everything went fine
    return RedirectToAction("Success");
}

从这个示例中可以看到,我们将处理委托给了服务层。这种服务的实现方式对ASP来说毫无意义。NET MVC应用程序。你可以使用NHibernate,实体框架,调用一些其他的服务,任何你能想到的,我们应该关心的是,我们正在处理我们的领域模型准备被处理,如果有错误,它会报告给我们。在服务层上处理验证的方式对ASP来说也不重要。. NET MVC应用程序=>你可以使用城堡验证器,流畅验证,数据注释,任何…

就映射而言,如果您正在更新现有的域实体,则可能会有额外的步骤。在这种情况下,视图模型可能不包含域模型的所有属性,因为在这个特定的视图中,例如,我们只允许编辑一些属性。在这种情况下,流是这样的:

// Fetch the original domain model we want to update
var domainModel = _service.Get(viewModel.Id);
// Update only the properties that are present on the view:
Mapper.Map<UpdateViewModel, DomainViewModel>(viewModel, domainModel);
// Pass to the service layer for processing:
string error;
if (!_service.Update(domainModel, out error))
{
    ...
}

相关内容

  • 没有找到相关文章

最新更新