Как мне обрабатывать поиски в моей ViewModel? - PullRequest
1 голос
/ 21 февраля 2012

Моя таблица базы данных для зданий хранит тип здания в виде кода. В отдельной справочной таблице хранится описание этого кода.

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

Я могу видеть один вариант. Я хочу знать, есть ли лучший вариант.

BuildingViewModel
{
 public string BuildingTypeCode { get;set;}  
 ...other properties
}

Тогда, на мой взгляд

code...

<p>@MyService.GetDescription(Model.BuildingTypeCode)</p>

...code

Я ошибаюсь, как я думаю? если я сделаю вышеупомянутое, я создам зависимость в моем View от службы?

Обновление 1

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

    public ViewResult Show(string ParcelId)
    {
        var result = _service.GetProperty(ParcelId);
        var AltOwners = _service.GetAltOwners(ParcelId);
        var Buildings = _service.GetBuildings(ParcelId);

        ParcelDetailViewModel ViewModel = new ParcelDetailViewModel();
        ViewModel.AltOwnership = new List<OwnerShipViewModel>();
        ViewModel.Buildings = new List<BuildingViewModel>();

        AutoMapper.Mapper.Map(result, ViewModel);
        AutoMapper.Mapper.Map<IEnumerable<AltOwnership>, IEnumerable<OwnerShipViewModel>>(AltOwners,ViewModel.AltOwnership);
        AutoMapper.Mapper.Map<IEnumerable<Building>, IEnumerable<BuildingViewModel>>(Buildings, ViewModel.Buildings);
        ViewModel.Pool = _service.HasPool(ParcelId);
        ViewModel.Homestead = _service.IsHomestead(ParcelId);

        return View(ViewModel);
    }

public class ParcelDetailViewModel
    {
        public IEnumerable<OwnerShipViewModel> AltOwnership { get; set; }
        //public IEnumerable<ValueViewModel> Values { get; set; }
        public IEnumerable<BuildingViewModel> Buildings { get; set; }
        //public IEnumerable<TransferViewModel> Transfers { get; set; }
        //public IEnumerable<SiteAddressViewModel> SiteAddresses { get; set; }

        public string ParcelID { get; set; }
        //public string ParcelDescription { get; set; }
        //public int LandArea { get; set; }
        //public string Incorporation { get; set; }
        //public string SubdivisionCode {get;set;}
        public string UseCode { get; set; }
        //public string SecTwpRge { get; set; }
        //public string Census { get; set; }
        //public string Zoning { get; set; }
        public Boolean  Homestead {get;set;}

        //public int TotalBuildingArea { get; set; }
        //public int TotalLivingArea { get; set; }
        //public int LivingUnits { get; set; }
        //public int Beds { get; set; }
        //public decimal Baths { get; set; }
        public short Pool { get; set; }
        //public int YearBuilt { get; set; }

    }

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

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

Вы можете выполнить поиск службы, но сохранить этот код в контроллере. Модель представления должна считаться готовой к просмотру (за исключением некоторого форматирования).

class BuildingViewModel 
{ 
    public string BuildingTypeCode { get;set;}   
    ...other properties 
} 

, а затем выполните поиск до , которое вы визуализируете:

public ActionResult Building()
{
    var typeCode = // get from original source?
    var model = new BuildingViewModel
    {
        BuildingTypCode = MyService.GetDescription(typeCode)
    };
    return View("Building", model);
}

Исходя из длинной строки пользовательских тегов JSP, я боюсь иметь какой-либо код, скрытый в макете представления. ИМО, этот слой должен быть как можно тупее.

0 голосов
/ 21 февраля 2012

Я бы порекомендовал иметь помощника, который это делает, или DisplayTemplate

public class ViewHelpers
{
  public static string GetDescription(string code)
  {
    MyService.GetDescription(Model.BuildingTypeCode);
  }
}

или

@ModelType string
@Html.DisplayFor("",MyService.GetDescription(Model.BuildingTypeCode));

Больше информации о шаблонах: http://www.headcrash.us/blog/2011/09/custom-display-and-editor-templates-with-asp-net-mvc-3-razor/

Оба эти подхода вводят зависимость от вашего сервиса, но вы можете протестировать / изменить их в одном месте, а не во всем приложении (плюс использование выглядит чище).

...