MVC - 根据用户的属性显示对象

时间:2013-05-25 16:19:29

标签: c# asp.net-mvc asp.net-mvc-4

好吧,我有三个可能很愚蠢的问题,但是我非常感谢你被困住后的输入或提示或链接:

有一个实体“投资组合”,其中包含股票,期权,期货和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);
    }

2 个答案:

答案 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.

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