【问题标题】:How would I make a ViewModel that displays a list of categories gathered from a list of products that was generated on another entity?如何制作一个 ViewModel 来显示从另一个实体上生成的产品列表中收集的类别列表?
【发布时间】:2012-08-03 14:22:45
【问题描述】:
  • 我有各种locations,每个都有自己的Products 列表。
  • 每个Product 都属于一个SubCategory。
  • 每个SubCategory 都属于一个Category。

当给定Location 时,我需要显示Categories 的列表,因此我需要一个可以提取与所述位置的产品相关联的潜在类别列表的 ViewModel。

我想做这样的事情(我的 ViewModel):

public class LocationSummaryViewModel
{
    public Location Location { get; set; }

    private ICollection<Category> categories;

    public ICollection<Category> Categories
    {
        get
        {
            if ( Establishment != null )
            {
                foreach (var item in Location.Products)
                {
                    categories.Add(item.SubCategory.Category);
                }
                return categories;
            }
            else
            {
                Categories.Add(new Category { Name = "Default Category" });
                return categories;
            }
        }
    }
}

但这在语法上不起作用,因为categories 从未实例化。另外,我不确定是否应该在 ViewModel 中添加这么多逻辑。

通过将逻辑从包含在我的 ViewModel 中的位置中的产品列表中提取类别信息,我是否朝着正确的方向前进?还是我会以一种非常不寻常的方式来解决这个问题?

如果我以完全奇怪的方式执行此操作,那么从 Location 实体中包含的产品列表中获取类别信息的更好方法是什么?


作为参考,我的位置模型:

public class Location
{
    public int LocationId { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }  
}

我的产品型号:

public class Product
{
    public int ProductId { get; set; }

    public string Name { get; set; }

    public int CategoryId { get; set; }

    public virtual SubCategory SubCategory { get; set; }

    public int LocationId { get; set; }

    public virtual Location Location { get; set; }
}

和我的子类别模型:

public class SubCategory
{
    public int SubCategoryId { get; set; }

    public string Name { get; set; }

    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }
}

更新:我在下面发布了我自己问题的潜在答案 - 欢迎提供更好的答案/建议

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 entity-framework viewmodel lazy-loading


    【解决方案1】:

    业务逻辑不应该在视图模型中,而是应该在域模型中,为什么不尝试将业务逻辑移动到您的域模型中,例如 Location。如果不是,你就违反了Anemic model anti-pattern

    View Model 应该包含支持 View 的逻辑,仅此而已。

    实际上并不知道Establishment 来自哪里,但Location 类可能看起来像:

    public class Location
    {
        public int EstablishmentId { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Product> Products { get; set; }
    
        public Category GetCategories()
        {
            foreach (var item in Location.Products)
            {
                categories.Add(item.SubCategory.Category);
            }
            return categories;
        }
    }
    

    【讨论】:

    • 建立是复制/粘贴的剩余部分(我的实际变量的名称与我在上述问题中使用的名称不同)。
    • 我能够完全消除 ViewModel 并使用您的方法在视图中引用 Location 实体。还导致更清洁的控制器。谢谢。
    【解决方案2】:

    如果我将 ViewModel 更改为:

    public class LocationSummaryViewModel
    {
        public Location Location { get; set; }
    
        public  ICollection<Category> Categories { get; set; }
    }
    

    并将我的逻辑移至控制器:

    public PartialViewResult _LocationSummary(int id)
    {
        Location location = _locationRepository.Locations.FirstOrDefault(p => p.LocationId == id);
        if (location != null)
        {
            var Categories = location.Products.Select(item => item.SubCategory.Category).Distinct().ToList();
    
            var model = new LocationSummaryViewModel
                {
                    Location = location,
                    Categories = Categories
                };
            return PartialView(model);
    . . .
    

    我似乎得到了一个合适的结果(需要一些调整来摆脱多个相同的Categories),但我希望找到一种方法来摆脱控制器中的逻辑.

    这可能会导致问题,因为工作需要大量延迟加载。 . .目前还不确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多