1
  • 我有各种各样locations的,每个都有自己的Products.
  • 每个都Product属于一个SubCategory
  • 每个都SubCategory属于一个Category

我需要Categories在给定 a 时显示一个列表Location,因此我需要一个 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; }
}

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

4

2 回答 2

1

业务逻辑不应该在视图模型中,而是应该在域模型中,为什么不尝试将业务逻辑移动到像 Location 这样的域模型中。如果不是,您就违反了贫血模型反模式

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

实际上不知道建立来自,但位置类可能看起来像:

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;
    }
}
于 2012-08-03T14:56:53.537 回答
0

如果我将 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,但我希望找到一种方法来摆脱我的控制器中的逻辑。

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

于 2012-08-03T14:52:17.330 回答