【问题标题】:ASP.NET MVC: Where to place code populating shared view?ASP.NET MVC:在哪里放置填充共享视图的代码?
【发布时间】:2016-08-26 23:40:48
【问题描述】:

我是 MVC 的新手,并且来自 asp.net webforms 背景,所以我仍然发现我很难打破这种 webforms 思维方式。一个特别的问题是,如何处理我需要填充共享视图的代码?

在 asp.net 网络表单中,假设我的母版页上有一个标签。要填充该标签,我需要做的就是将一些代码放入母版页代码隐藏中,所有引用此母版页的页面都会看到它。

然而,在 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);
    }

我应该如何处理这个共享代码,这样我就不需要继续复制它了?

谢谢

【问题讨论】:

  • 如果它不是一个 MVC 控制器而是一个简单、普通类?一样的……
  • 使用声明将这些内容存储在 cookie 中并在视图/布局中访问声明会更好吗?

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


【解决方案1】:

您可以将共享代码放在方法中。

如果该代码在多个控制器之间共享,那么您可以为您的控制器创建一个基类,并从您的基类派生而不是从 Controller

如果您在所有操作中都执行相同的操作,您可以覆盖 Controller.Initialize,并在那里编写代码。

【讨论】:

    【解决方案2】:

    您可以使用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 管道中运行,它也与主操作隔离,并且您的主操作不需要了解这种常见的共享逻辑。

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多