ASP.NET MVC: как мне обрабатывать модель представления со многими свойствами? - PullRequest
5 голосов
/ 02 октября 2010

Таким образом, у меня есть соотношение просмотров к моделям почти 1: 1, и кажется, что все идет хорошо. Если я правильно понимаю их назначение, кажется, что модели представлений должны

  1. "Урезать" модели сущностей, чтобы на уровень представления передавались только соответствующие свойства
  2. Добавить дополнительную информацию, необходимую для представления, такую ​​как список сокращений штатов или типов контактов при создании, скажем, адреса.

Пытаясь придерживаться этих принципов, я немного ударил стену своим контроллером отчетов. Различные отчеты, которые создаются для клиента, требуют доступа к примерно 30 различным свойствам. Таким образом, моя модель представления выглядит очень похожей на мою модель Entity.

Конечно, самое простое решение - просто передать модель Entity в представление, чтобы у меня был доступ ко всем свойствам, однако мне также нужно иметь возможность создавать отчеты для пустых или «неполных» клиентов. Это приводит к тому, что при попытке доступа к свойствам навигации в моих моделях сущностей возникают проблемы со ссылками на ноль.

Таким образом, я могу либо использовать нулевую проверку практически для каждого поля в представлении, что не кажется слишком привлекательным ... ИЛИ Я мог бы реализовать модель представления, чтобы избежать исключений нулевой ссылки. Проблема в том, что я получу модель представления, которая выглядит следующим образом:

var customer = customersRepository.GetCustomer(id);
var viewModel = new CustomersViewModel()
{
    FirstName = customer.FirstName,
    LastName = customer.LastName,
    Address = customer.MailingAddress.Address,
    City = customer.MailingAddress.City,
    // and on and on for about 30 different properties
};
return View(viewModel);

Распечатка всех этих свойств - одна из тех вещей, которая кажется неправильной. Мне не хватает более элегантного решения этой проблемы?

Ответы [ 4 ]

7 голосов
/ 02 октября 2010

Проблема в том, что я получу модель представления, которая выглядит следующим образом

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

4 голосов
/ 02 октября 2010

Вы обязательно должны заглянуть в AutoMapper (http://automapper.codeplex.com/).

AutoMapper.Mapper.CreateMap(typeof(CustomersModel), typeof(CustomersViewModel));

AutoMapper.Mapper.CreateMap<CoolObject, CoolObjectViewModel>()
    .ForMember(d => d.Property1, f => f.MapFrom(s => s.Property1))
    .ForMember(d => d.Property2, f => f.MapFrom(s => s.Property2))
    .ForMember(d => d.Property3, f => f.MapFrom(s => s.Property3));
2 голосов
/ 02 октября 2010

Распечатка всех этих свойств - одна из тех вещей, которые просто кажутся неправильными

До какого уровня вы бы хотели пройти, в конце концов вам придется набирать all.

Итак, я считаю, что этот подход одинаково хорошо.

0 голосов
/ 02 октября 2010

Я действительно не понимаю, чего вы пытаетесь достичь здесь ... нет ничего плохого в написании большего количества кода ... не имеет значения, какой у вас размер кода, если он конкретен и хорошо организован.Вас должно беспокоить то, как вы уменьшаете взаимодействия с базой данных, извлекаете только необходимые свойства из БД.

, поскольку ваш код показывает, что вы извлекаете весь объект клиента и затем отображаете некоторые свойства, почему вы не получаете только те свойства, которые вам нужны.

также если вы используете свойства почтового адресапочему вы не передаете весь объект mailingaddres как свойство, почему вы разделяетесь на другие свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...