在使用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);
在HTML中:
@Html.DropDownList("ddVAT", new SelectList(Model.ListVAT, "Id", "Value", Model.Estimation.AdminVAT))
“值”字段是一个小数,当我在页面上显示它时,我有5个小数,我需要2。这里的请求很简单,但以后在其他类的其他字段上可能会更复杂。在这种情况下,这是行不通的,但是可以使用相同的方式处理其他类。
在过去,有人(Darin)告诉我这不是使用AutoMapper进行此操作的好方法……问题是。这是最好的方法吗?
编辑:和cshtml文件中没有代码
谢谢,
最佳答案
恐怕您的模型存在一些严重问题。如果AdminVATDTO
具有某些格式属性,但似乎旨在用作视图模型,但视图模型绝不应从模型派生。那不是正确的设计。
这是一个正确的设计:
域模型(不更改它,因为我想这已经存在):
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; }
}
然后定义
AdminVAT
和AdminVATViewModel
之间的映射:Mapper
.CreateMap<AdminVAT, AdminVATViewModel>()
.ForMember(
dest => dest.Value,
opt => opt.MapFrom(src => src.Value.ToString("n2"))
);
然后在您的控制器操作中:
public ActionResult Foo()
{
IEnumerable<AdminVAT> listAdminVAT = ... fetch from repo
var model = new MyViewModel
{
ListVAT = Mapper.Map<IEnumerable<AdminVAT>, IEnumerable<AdminVATViewModel>>(listAdminVAT)
};
return View(model);
}
最后在视图中:
@model MyViewModel
@Html.DropDownListFor(
x => x.SelectedVAT,
new SelectList(Model.ListVAT, "Id", "Value")
)
关于c# - 最佳实践:ASP.NET MVC中数据库类到对象类的验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6385386/