[英]mvc DisplayName or Display(Name=…) depending on another model property
[英]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.