1

好吧,我有三个可能很愚蠢的问题,但我非常感谢您的输入或提示或链接,因为我被卡住了:

有一个实体“投资组合”,其中包含股票、期权、期货和 groupID 的列表,并且有几个具有 groupID 的用户。我只想向他和投资组合的 groupID 相同的用户显示投资组合。

到目前为止,我有一个视图模型,其中包含该视图所需的所有实体的列表。在视图本身中,将显示所有投资组合、所有股票、所有选项等,而不仅仅是与用户具有相同组的那些。

除了它不起作用之外,我觉得在这样的视图中尝试过滤同一组用户和投资组合是错误的:

@if (portfolio.GroupID == Model.UserProfiles.Find(m => m.UserName == User.Identity.Name).GroupId)

Q1:我会很高兴在如何管理这样的事情的正确方向上的提示/示例/链接。

Q2:我在这里使用视图模型的概念完全错误吗?

    public List<StockPosition> StockPositions { get; set; }
    public List<OptionPosition> OptionPositions { get; set; }
    public List<FuturePosition> FuturePositions { get; set; }
    public List<BondPosition> BondPositions { get; set; }
    public List<FondsPosition> FondsPositions { get; set; }
    public List<Portfolio> Portfolios { get; set; }
    public List<UserProfile> UserProfiles { get; set; }

Q3: PortfolioController 将几乎所有内容的列表交给视图。应该在这里实现过滤吗?

public ActionResult Index()
    {
        var viewModel = new PortfolioExtended();
        viewModel.StockPositions = db.StockPositions.ToList();
        viewModel.BondPositions = db.BondPositions.ToList();
        viewModel.FuturePositions = db.FuturePositions.ToList();
        viewModel.OptionPositions = db.OptionPositions.ToList();
        viewModel.FondsPositions = db.FondsPositions.ToList();
        viewModel.Portfolios = db.Portfolios.ToList();
        viewModel.UserProfiles = db.UserProfiles.ToList();
        return View(viewModel);
    }
4

2 回答 2

2

Q1:以下是我的处理方法:

Index操作中,将所有内容缩小到与当前用户相关的内容。

public ActionResult Index()
{
    var viewModel = new PortfolioExtended();
    var currentUser = User.Identity.Name;
    var userGroupId = db.UserProfiles.Single(x => x.UserName == currentUser).GroupId;
    viewModel.Portfolios = db.Portfolios.Where(x => x.GroupID == userGroupId);
    // Anything else you need to intialise
    return View(viewModel);
}

这假定用户名在 UserProfiles 列表中是唯一的,并将视图限制为仅具有相关的投资组合。

您是否说过其他实体(期货、债券等)是投资组合的一部分?如果是这种情况,您应该能够通过使用来访问它们portfolio.Whatever,而不是将它们全部作为它们自己的列表传递。如果它们是分开的,请忽略这一点。

Q2 a 的概念ViewModel是通过所有你需要显示在View. 在这种情况下,您似乎做对了,您可能不需要那里的所有东西,但这是一般的想法。

Q3过滤应该发生在控制器中,是的。将其归结为您需要的东西。

Q2 和 Q3 的答案之间的区别在于,您在视图中可能ViewModel需要的所有东西都有属性,并且控制器操作将这些列表等过滤到您在此特定实例中需要的东西。

于 2013-05-25T16:36:13.920 回答
1

使用控制器对数据进行任何过滤。仅将数据添加到视图实际使用的模型中。

因此,根据控制器操作中的组和用户标识符过滤您的投资组合。

var currentUserProfile = db.UserProfiles.Where(p => p.UserName == User.Identity.Name).Single();
int groupId = currentUserProfile.GroupId;
viewModel.StockPositions = db.StockPositions.Where(p => p.GroupId == groupId).ToList();
// etc.

在视图中时,显示视图中包含的数据,相信它是针对用户/组的。

于 2013-05-25T16:29:20.413 回答