[英]ASP.NET MVC: Where to place code populating shared view?
我是MVC的新手,来自asp.net Webforms背景,所以我仍然发现我很难打破Webforms的思维方式。 特别是一个问题,该如何处理需要填充共享视图的代码?
在asp.net Webforms中,可以说我的主页上有一个标签。 要填充该标签,我需要做的就是在母版页代码后面放置一些代码,所有引用该母版页的页面都将看到它。
但是,在MVC中,我不确定在哪里放置共享代码。 当前,我在调用引用共享视图的视图的所有操作上复制了以下代码,因此可以在共享视图上填充数据:
public ActionResult MyFirstView()
{
Account account = _accountRepository.GetAccountByEmail(System.Web.HttpContext.Current.User.Identity.Name);
List<Campaign> campaigns = new List<Campaign>();
campaigns = _campaignRepository.GetCampaignsByAccountId(account.AccountId);
LayoutModel model = new LayoutModel
{
AccountId = account.AccountId,
Email = account.Email,
Name = account.Name,
LogoPath = account.LogoPath,
};
foreach (Campaign campaign in campaigns)
{
model.AddCampaigns(campaign);
}
return View(model);
}
我应该如何处理此共享代码,所以不需要继续复制它?
谢谢
您可以将共享代码放在方法中。
如果该代码在多个控制器之间共享,那么您可以为控制器创建一个基类,并从您的基类而不是Controller
派生
如果您在所有操作中都做相同的事情,则可以覆盖Controller.Initialize
,然后在其中编写代码。
您可以使用“ Child Action
。 想法是将此共享代码放入特殊的控制器操作中:
public ActionResult MySharedAction()
{
Account account = _accountRepository.GetAccountByEmail(System.Web.HttpContext.Current.User.Identity.Name);
List<Campaign> campaigns = _campaignRepository.GetCampaignsByAccountId(account.AccountId);
LayoutModel model = new LayoutModel
{
AccountId = account.AccountId,
Email = account.Email,
Name = account.Name,
LogoPath = account.LogoPath,
};
foreach (Campaign campaign in campaigns)
{
model.AddCampaigns(campaign);
}
return PartialView(model);
}
然后具有相应的局部视图以显示此共享视图模型:
@model LayoutModel
...
您可以将其包含在_Layout.cshtml
中的所需位置:
<div>@Html.Action("MySharedAction", "SomeController")</div>
子操作即使与主要操作在相同的HTTP管道中运行,也可以与主要操作隔离,并且您的主要操作不需要了解此公共共享逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.