【问题标题】:Where is the BEST PRACTICES place to put a list of Countries in a MVC Application?在 MVC 应用程序中放置国家列表的最佳实践位置在哪里?
【发布时间】:2012-01-25 20:04:12
【问题描述】:

在繁重的环境应用程序中,我们有用户、位置、bla bla bla...,并且在许多情况下,我们会调用一个服务来检索国家/地区列表。

实现这一点的“最佳实践”或“正确方法”在哪里。此方法在多个地方被调用,并且许多对象都有List<CountryVO> 属性。

特别考虑使用 Razor 视图经常不得不将此属性添加到 ModelViews

解决方案是使用 DAL / BLL / SERVICE / UI[s] 架构。

真实例子:

public class User {
...
...
public List<DeliveryZoneVO> DeliveryZones {get;set;}
    public User() {
    ...
        DeliveryZones = service.GetDeliveryZones().ToList();
    }
}

DeliveryZoneVO 类来自 web 服务,所以一个属性是

int IdCountry

类 User 有一个 DeliveryZoneVO 列表,如该类所示,这里的“问题”是因为它从 Web 服务检索数据,所以我只有国家的 ID。

当我准备控制器中的数据发送到视图时:

UserModelView userMV = new UserModelView();
userMV.user = service.GetUserById(1);
ViewData.Model = userMV;

但是,在 userMV.user 中,我有 DeliveryZones 以及带有 IdCountries 的 DeliveryZoneVO 对象列表。

在视图中,当我这样做时(例如):

@DisplayFor(m => m.user.DeliveryZones)

我想显示国家名称,只有 ID。所以我需要在某个地方提供参考。问题在于应该将这些数据放在哪里,这被认为是最佳实践。

在所有模型视图中(在示例的情况下,UserModelView() 具有 List 的属性国家/地区吗?

【问题讨论】:

    标签: asp.net-mvc razor model-view


    【解决方案1】:

    一件好事,因为这类问题是有一个派生自 controllerBaseController 类,以及您从它派生的所有其他控制器。

    BaseController 中放置一个仅带有getter 的静态List&lt;CountryVO&gt; 属性,这样它将被初始化一次,并且您的所有控制器和视图都可以访问(如果您使用ViewModel 或@987654326 传递它@)。


    例子:

    public class BaseController : Controller
    {
        private static List<CountryVO> _allCountries;
    
        public static List<CountryVO> AllCountries
        {
            get{ return _allCountries ?? _GetCountriesFromSomeWhere();}
        }       
    }
    
    public class HomeController : BaseController 
    {
        public ActionResult Index()
        {
            ViewBag.AllCountries  = this.AllCountries;          
            return View();
        }
    }
    

    【讨论】:

    • 我猜这对于一个相当小的网站来说是一个不错的选择,但由于这是一个大/重的网站,我不希望所有控制器和视图中都包含该国家/地区列表。实际上,有时我什至不想调用该服务。即使这是一个共同的财产,它也不应该是一个全球性的财产。也许以某种方式装饰控制器?不知道这是否可行或如何。
    • 1.它将在您发送的唯一视图中。 2. 这将是一项您可以从所有控制器中使用的“服务”,但您不必调用它。对于任意数量的控制器,它只会被初始化一次!
    • 你能详细说明一下吗?
    • 太棒了!只为其他人:返回_allCountries ?? _allCountries = GetCountriesFromSomeWhere();应该返回_allCountries ?? GetCountriesFromSomeWhere();
    【解决方案2】:

    我会创建一个局部视图,它只负责呈现国家/地区列表。然后可以在一个地方对列表的呈现方式进行任何更改。我将创建一个模型类来封装调用服务以获取国家/地区。假设国家/地区列表是相当静态的,您可以处理模型类中的信息缓存,以减少对服务的调用并获得更好的性能。下面是模型中的一个方法示例,该方法从服务器缓存中获取国家/地区列表(如果可用)。

        const string cacheId = "deliveryZones";
    
        public List<DeliveryZoneVO> GetDeliveryZones()
        {
            List<DeliveryZoneVO> deliveryZones = (List<DeliveryZoneVO>)HttpRuntime.Cache.Get(cacheId);
            if (deliveryZones == null)
            {
                deliveryZones = service.GetDeliveryZones().ToList();
                System.Web.HttpContext.Current.Cache.Insert(cacheId, deliveryZones);
            }
            return deliveryZones;
    
        }
    

    【讨论】:

    • 我不需要只显示国家列表,有些对象有 idCountry 属性,我需要获取(例如)国家名称。因此,如果我显示联系人的地址列表,我想显示他们的国家/地区名称。
    • 我想我不明白那是什么问题。您想通过正确答案具体实现什么目标?
    • 类似在 ModelView 中有一个带有 DeliveryZones 的对象和一个 id 列表,然后当我迭代 DeliveryZones(我有 deliveryZone.IdCountry)但我想显示类似 Country[idCountry] 的内容。名称,因为这是基于服务的。这个 Country 对象我到处使用,也没有太大变化。所以我不想每次都为国家/地区调用服务,而且我是否必须在每个 ModelView 中定义它?可以吗?
    • 我知道一些完成任务的方法,这不是问题。问题是关于最佳实践,而不是完成它。
    猜你喜欢
    • 2017-05-13
    • 2015-03-03
    • 2011-02-22
    • 2011-11-10
    • 2011-11-09
    • 2014-01-22
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多