簡體   English   中英

MVC - 根據用戶的屬性顯示對象

[英]MVC - Display objects depending on user's property

好吧,我有三個可能是愚蠢的問題,但是我非常感謝你的輸入或提示或鏈接,因為我被卡住了:

有一個實體“投資組合”,其中包含股票,期權,期貨和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);
    }

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具有視圖中可能需要的所有內容的屬性,控制器操作會過濾這些列表等,直到您在此特定實例中需要的內容。

使用控制器進行任何數據過濾。 僅將數據添加到視圖實際使用的模型中。

因此,請根據控制器操作中的組和用戶標識過濾您的投資組合。

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.

在視圖中,顯示視圖中包含的數據,相信它是為用戶/組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM