最佳实践:ASP.NET MVC进行验证

本文关键字:MVC 验证 NET ASP 最佳 | 更新日期: 2023-09-27 17:59:28

在一个使用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做这件事不是一个好方法。。。问题是Wich是最好的方法吗?

编辑:cshtml文件中没有代码

谢谢,

最佳实践:ASP.NET MVC进行验证

恐怕您的模型存在一些严重问题。这个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; }
}

然后定义CCD_ 2和CCD_

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")
)