C# 最佳实践:ASP.NET MVC中的数据库类到对象类进行验证

C# 最佳实践:ASP.NET MVC中的数据库类到对象类进行验证,c#,asp.net-mvc,controller,automapper,C#,Asp.net Mvc,Controller,Automapper,在使用NHibernate的项目中,我有这样一个类: public class AdminVAT : IAdminDecimal { public virtual int Id { get; set; } public virtual int Code { get; set; } public virtual decimal Value { get; set; } } 在ASP.NET MVC中,我希望对某些字段进行一些验证或/和格式化。然后我用AutoMapper试了

在使用NHibernate的项目中,我有这样一个类:

public class AdminVAT : IAdminDecimal
{
    public virtual int Id { get; set; }
    public virtual int Code { get; set; }
    public virtual decimal Value { get; set; }
}
在ASP.NET MVC中,我希望对某些字段进行一些验证或/和格式化。然后我用AutoMapper试了一下:

public class AdminVATDTO : AdminVAT
{
    [DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]
    public override decimal Value { get; set; }
}
在控制器中:

IList<AdminVAT> listAdminVAT = new AdministrationService(session).ListDecimal<AdminVAT>();
AutoMapper.Mapper.CreateMap<AdminVAT, AdminVATDTO>();
model.ListVAT = AutoMapper.Mapper.Map<IList<AdminVAT>, IList<AdminVATDTO>>(listAdminVAT);
值字段是一个小数,当我在页面上显示它时,我有5个小数,我需要2个。这里的请求很简单,但以后在其他类的其他字段上可能会更复杂。在本例中,这不是工作,而是使用相同的方法在其他类上工作

在过去的一段时间里,有人Darin告诉我使用AutoMapper来做这件事不是一个好方法。。。问题是。做这件事的最好方法是什么

编辑:cshtml文件中没有代码


谢谢,

恐怕你们的型号有一些严重的问题。如果这个adminivatdto上有一些格式化属性,但是视图模型不应该从模型派生,那么它似乎是作为一个视图模型使用的。那不是正确的设计

这是一个正确的设计:

域模型未更改此项,因为我认为此项已存在:

public class AdminVAT : IAdminDecimal
{
    public virtual int Id { get; set; }
    public virtual int Code { get; set; }
    public virtual decimal Value { get; set; }
}
查看模型:

public class AdminVATViewModel
{
    public int Id { get; set; }
    public string Value { get; set; }
}

public class MyViewModel
{
    public string SelectedVAT { get; set; }
    public IEnumerable<AdminVATViewModel> ListVAT { get; set; }
}
然后在控制器操作中:

public ActionResult Foo()
{
    IEnumerable<AdminVAT> listAdminVAT = ... fetch from repo
    var model = new MyViewModel
    {
        ListVAT = Mapper.Map<IEnumerable<AdminVAT>, IEnumerable<AdminVATViewModel>>(listAdminVAT)
    };
    return View(model);
}

恐怕你们的模型有一些严重的问题。如果这个adminivatdto上有一些格式化属性,但是视图模型不应该从模型派生,那么它似乎是作为一个视图模型使用的。那不是正确的设计

这是一个正确的设计:

域模型未更改此项,因为我认为此项已存在:

public class AdminVAT : IAdminDecimal
{
    public virtual int Id { get; set; }
    public virtual int Code { get; set; }
    public virtual decimal Value { get; set; }
}
查看模型:

public class AdminVATViewModel
{
    public int Id { get; set; }
    public string Value { get; set; }
}

public class MyViewModel
{
    public string SelectedVAT { get; set; }
    public IEnumerable<AdminVATViewModel> ListVAT { get; set; }
}
然后在控制器操作中:

public ActionResult Foo()
{
    IEnumerable<AdminVAT> listAdminVAT = ... fetch from repo
    var model = new MyViewModel
    {
        ListVAT = Mapper.Map<IEnumerable<AdminVAT>, IEnumerable<AdminVATViewModel>>(listAdminVAT)
    };
    return View(model);
}

Haaaaaaaa很好的解释,我相信也会帮助其他人!谢谢:还有一个问题。当我想使用某些属性ex:[RequiredErrorMessage=My Error Message]时,我如何使用您的方式来执行此操作?当你混合了MVC属性和我的初始值question@Kris-一、 您可以使用[Required]属性装饰视图模型上的SelectedVAT属性。这将强制用户在下拉列表中选择一个值,特别是在您提供了一个空值作为默认值的情况下。然后在控制器中使用TryValidateModel,并在我的情况下返回一个不同的PartialView(如果模型受尊重或not@Kris-一、 就我个人而言,我从不使用TryValidateModel。我让post action将视图模型作为操作参数,并在内部测试ModelState.IsValid,以便知道如果成功,我是否应该重新显示视图或重定向。Haaaaaaaaaa非常好的解释,我肯定也会帮助其他人!谢谢:还有一个问题。当我想使用某些属性ex:[RequiredErrorMessage=My Error Message]时,我如何使用您的方式来执行此操作?当你混合了MVC属性和我的初始值question@Kris-一、 您可以使用[Required]属性装饰视图模型上的SelectedVAT属性。这将强制用户在下拉列表中选择一个值,特别是在您提供了一个空值作为默认值的情况下。然后在控制器中使用TryValidateModel,并在我的情况下返回一个不同的PartialView(如果模型受尊重或not@Kris-一、 就我个人而言,我从不使用TryValidateModel。我让post操作将视图模型作为操作参数,并在内部测试ModelState.IsValid,以便知道如果成功,是否应该重新显示视图或重定向。