0

我们正在使用 ASP.Net MVC 和 Google Publisher Tags (GPT)。

GPT 要求您<head><body>. 这里的关键依赖是在这两个地方都是一个必须匹配的 id。所以头部将包含一些 Javascript,其中包括:

<head>
<script>
...
DefineSlot('div-gpt-ad-123456789-0', 'foo', 'bar')
...
</script></head>

<body>
...
<div id='div-gpt-ad-123456789-0'>
  <script> 
  ...
  Display('div-gpt-ad-123456789-0')
  ...
  </script>
</div>
...

我们如何管理这两段代码之间的依赖关系?关键是两个部分的 id 必须匹配。

我们想使用 MVC 动态地创建这些代码。因此,在任何视图、部分视图或布局中,我都可以添加一个可能如下所示的辅助调用:

@Html.CreateAd(size, "foo", "bar")

@Html.CreateAd可以在视图、局部视图、布局或嵌套布局中的任何位置调用。

您如何使用 ASP.Net MVC 编写进入的代码<head>

任何建议表示赞赏。我只是在寻找方向,而不是一个完整的解决方案。

非常感谢。

4

1 回答 1

1

你有几种不同的方法来做到这一点。

您可以将 id 添加到 ViewData 或基本视图模型中。

然后在基本控制器中或通过操作过滤器中的 OnActionExecuting 或 OnActionExecuted,您可以将数据添加到您喜欢的任何位置。如果您需要这方面的示例,请对此答案发表评论。

然后,您可以从您决定的 2 个来源之一中阅读您的助手(每个部分一个)。两条路我都走了。如果您的所有页面都将有广告,那么我会倾向于基本 ViewModel。如果它更罕见,ViewData 会更合适。

要在 htmlHelper 扩展方法中访问视图数据:

public static class HtmlExtension
{
    public static MvcHtmlString RenderAdHead(this HtmlHelper h)
    {
        h.ViewContext.ViewData.Model // a test and cast here
        h.ViewContext.ViewData["AdIdentifier"] // test for null and cast here

        string tags = String.Empty;
        //build up string to resemble your script/html tags using either of the 
        //sources above, so long as either source is not empty.

        return new HtmlMvcString(tags);
    }
}

还有一些过滤器代码:

public class AdvertisingFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       List<String> idList = null; // list of string might not be adequate. depends on your implementation
        //read advertising ids from your datastore or wherever you have. 



        filterContext.Controller.ViewData["advertisingFilter"] = idList;
    }
}

基本控制器几乎相同,而是您直接拥有控制器上下文。您只需要确保您的所有控制器都继承自它们。

于 2013-01-11T03:24:50.620 回答