繁体   English   中英

ASP.NET MVC:哪里将代码填充共享视图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM