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

发布于 2025-01-08 01:34:35 字数 2696 浏览 2 评论 0原文

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

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

My database table for buildings stores the building type as a code. In a separate lookup table the description for that code is stored.

How should I design my ViewModel and where will I need to make the call to get the associated description value?

I sort of can see one option. I want to know if there is a better option.

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

Then in my view

code...

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

...code

Am I incorrect in the way I am thinking? if I do the above I create a dependency in my View to the service?

Update 1

Working through some of the solutions offered. I seem to run into another issue. I can't access the constructor of each building directly...

    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; }
        
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

意中人 2025-01-15 01:34:35

我的理解是视图模型是为了显示准备好的数据。我认为这里真正的问题是将模型相关逻辑放入视图中。

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

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 自定义标记,我害怕在视图布局中隐藏任何代码。 IMO,该层应该尽可能愚蠢。

My understanding is that the view model is meant for display ready data. I think the real problem here is putting model dependent logic into the view.

You can do your service lookup but keep that code in the controller. The view model should be considered display ready (save for some formatting).

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

and then do the lookup before you render:

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

Having come from a long line of JSP custom tags I dread having any code hidden in the view layout. IMO, that layer should be as dumb as possible.

带上头具痛哭 2025-01-15 01:34:35

我建议有一个助手可以做到这一点,或者 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/

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

I would recommend having a helper that does that, or a DisplayTemplate

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

or

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

More info on templates: http://www.headcrash.us/blog/2011/09/custom-display-and-editor-templates-with-asp-net-mvc-3-razor/

Both of these approaches introduce a dependency on your service but you can test/change them in one single place, instead of the whole application (plus the usage looks cleaner).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文