好吧,我有三个可能很愚蠢的问题,但是我非常感谢你被困住后的输入或提示或链接:
有一个实体“投资组合”,其中包含股票,期权,期货和groupID的列表,并且有几个用户具有groupID。 我想仅向用户展示其投资组合,其中他和投资组合的groupID相同。
到目前为止,我有一个viewmodel,其中包含该视图所需的所有实体的列表。在视图中,显示所有投资组合,所有股票,所有期权等,而不仅仅是与用户具有相同组别的投资组合。
除了它不起作用之外,我觉得在视图中尝试过滤同一组用户和投资组合是错误的:
@if (portfolio.GroupID == Model.UserProfiles.Find(m => m.UserName == User.Identity.Name).GroupId)
Q1:我很乐意在如何管理这样的事情的正确方向提示/示例/链接。
Q2:我在这里使用viewmodel的概念完全错了吗?
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);
}
答案 0 :(得分: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 ViewModel
的概念是传递您需要在View
上显示的所有内容。在这种情况下,看起来你已经做对了,你可能不需要你拥有的所有,但这是一般的想法。
Q3 过滤器应该在控制器中进行,是的。把它归结为你需要的东西。
Q2和Q3的答案之间存在差异,ViewModel
具有视图中 所需的所有内容的属性,而控制器操作会过滤那些列出等等,直到你在这个特定实例中需要的东西。
答案 1 :(得分: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.
在视图中,显示视图中包含的数据,并相信它是针对用户/组的。