2013-05-25 36 views
1

好的对象,我有三个可能愚蠢的问题,但我会非常感谢从你输入或暗示或链接,因为我坚持:MVC - 显示根据用户的财产

有一个实体“投资组合”与名单股票,期权,期货和groupID,还有几个用户使用groupID。 我想只显示投资组合的用户,他和投资组合的组ID是相同的。

到目前为止,我有一个视图模型,其中包含该视图所需的所有实体列表。在视图本身中,所有投资组合,所有股票,所有期权等都显示出来,而不仅仅显示与用户相同的组。

除了这个事实,这是行不通的,我觉得这是不对的,试图在这样的视图筛选同组的用户和投资组合:

@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

是否是当前登录的用户查看索引页? –

+0

是的,用户必须先登录才能看到索引页面,并且每个用户都有一个groupId分配。 – peter

+0

您是否能够在索引操作中获取当前用户的ID? –

回答

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来访问它们,而不是将它们全部作为自己的列表传递。如果他们是分开的,忽略这一点。

Q2ViewModel的概念是通过您需要显示在View上的所有内容。在这种情况下,似乎你已经得到了正确的结果,你可能不需要你所有的,但这是一般的想法。

Q3过滤应该发生在控制器中,是的。把它弄清楚,只需要你需要的东西。

Q2和Q3的答案之间的差别则存在ViewModel拥有了所有东西的属性,你需要的视图和控制器动作过滤器那些名单等下给你在这个特定需要的东西实例。

+0

非常感谢,Colm!特别是对于你的解释,我发现我不需要视图模型,因为所有其他资产都通过外键关系包含在投资组合实体中。 – peter

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. 

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

+0

非常感谢您的支持,Matt。我会在冒烟后立即尝试。 – peter