Рекомендации: от класса базы данных до класса объекта в ASP.NET MVC для проверки - PullRequest
1 голос
/ 17 июня 2011

В проекте, использующем 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. Запрос здесь прост, но может быть более сложным позже в других областях в других классах.В данном случае это не работает, но работает с другими классами, используя тот же способ.

В предыдущем прошлом кто-то (Дарин) говорил мне, что это не очень хороший способ использовать AutoMapper для этого ...вопрос есть.Какой лучший способ сделать это?

Редактировать: и нет кода в файле cshtml

Спасибо,

1 Ответ

4 голосов
/ 17 июня 2011

Боюсь, что у вас есть серьезные проблемы с вашими моделями.Кажется, что это 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")
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...