我应该如何处理ViewModel中的查找

本文关键字:ViewModel 查找 处理 何处理 我应该 | 更新日期: 2023-09-27 18:25:31

我的建筑数据库表将建筑类型存储为代码。在单独的查找表中存储该代码的描述。

我应该如何设计我的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; }
        
    }

我应该如何处理ViewModel中的查找

我的理解是,视图模型是用于显示就绪数据的。我认为这里真正的问题是将依赖模型的逻辑放在视图中。

您可以进行服务查找,但将代码保留在控制器中。视图模型应视为已准备好显示(除了某些格式)。

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

然后在渲染前执行查找

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

由于来自一长串JSP自定义标记,我害怕在视图布局中隐藏任何代码。国际海事组织,这一层应该尽可能愚蠢。

我建议有一个助手来做这件事,或者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/

这两种方法都引入了对服务的依赖,但您可以在一个地方测试/更改它们,而不是在整个应用程序中进行测试/更改(而且使用看起来更干净)。