Asp.net mvc 在ASP.NETMVC中,如何管理视图和布局页面之间的依赖关系?

Asp.net mvc 在ASP.NETMVC中,如何管理视图和布局页面之间的依赖关系?,asp.net-mvc,Asp.net Mvc,我们正在使用ASP.NETMVC和谷歌发布者标签(GPT) GPT要求您在中创建javascript“槽”,并在中创建一些html+脚本。这里的关键依赖性是,在这两个地方都有一个必须匹配的id。因此,头部将包含一些Javascript,其中包括以下内容: <head> <script> ... DefineSlot('div-gpt-ad-123456789-0', 'foo', 'bar') ... </script></head> @Html

我们正在使用ASP.NETMVC和谷歌发布者标签(GPT)

GPT要求您在
中创建javascript“槽”,并在
中创建一些html+脚本。这里的关键依赖性是,在这两个地方都有一个必须匹配的id。因此,头部将包含一些Javascript,其中包括以下内容:

<head>
<script>
...
DefineSlot('div-gpt-ad-123456789-0', 'foo', 'bar')
...
</script></head>
@Html.CreateAd
可以在视图、局部视图、布局或嵌套布局中的任何位置调用

如何使用ASP.NETMVC对进入
的代码进行编程

如有任何建议,我们将不胜感激。我只是在寻找方向,不是一个完整的解决方案


非常感谢。

您有几种不同的方法可以做到这一点

可以将id添加到ViewData或基本viewmodel

然后在基本控制器中或通过actionfilters执行OnActionExecuting或OnActionExecuted,您可以将数据添加到您喜欢的任何位置。如果您需要这方面的例子,请在此答案上留下评论

然后,您的助手(每个部分一个)可以从您决定的两个来源之一阅读。我走了两条路。如果您的所有页面都将有广告,那么我将倾向于基本视图模型。如果这种情况比较少见,那么ViewData会更合适

要在htmlHelper扩展方法中访问viewdata,请执行以下操作:

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;
    }
}
公共类广告过滤器:ActionFilterAttribute
{
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
List idList=null;//字符串列表可能不够。具体取决于您的实现
//从您的数据存储或任何地方读取广告ID。
filterContext.Controller.ViewData[“advertisingFilter”]=idList;
}
}

basecontroller基本相同,相反,您直接拥有controllercontext。您只需确保所有控制器都继承自它们

您可以使用一个部分,例如@RenderSection(“Head”),在使用布局页面的任何视图中填充该部分,并对实际编号使用某种应用程序设置。在标题中创建代码所需的信息来自多个位置。它来自一个_HeaderLayout、一个_SideLayout、一个_footer布局,在某些情况下还来自视图。如何将所有这些片段聚集在一起,放入一个代码块中?不太清楚您的意思,您需要更多的示例来精确显示此代码是如何生成的\u LayoutSide.cshtml可能有Html.CreateAd(“位置”,“侧”),\u layoutsfooter.cshtml可能有Html.CreateAd(“位置”,“底部”)。在标题中,我需要在script元素中生成2行DefineSlot()。在主体中,将有2个div,每个div包装一个DisplayAd(我认为Chad在下面的轨道上是正确的。问题是我正在尝试创建/使用某种类型的临时页面广告注册表,Html.CreateAd将填充注册表,然后Html.CreateAdHeader将读取添加到注册表中的所有项目。但是视图、布局等是脚本代码,不是为这种类型设计的。)f工作。这取决于视图和布局中的代码布局吗?例如,假设我将Html.RenderAhead调用放在_LayoutPage的头部。现在,我碰巧希望在所有页面的底部都显示一个广告,因此我在主体部分的底部包含一个Html.CreateAd。如果脚本页面按顺序呈现,那么Html.RenderAhead方法在完全填充之前返回?抱歉,我不认为我在第一次阅读它时理解了第一部分。我相信您是说代码应该进入基本控制器(默认情况下),而不是将Html.Ad放入布局页面和视图中。然后,这些辅助对象将被放置在需要的视图/布局中,并将从ViewData/ViewBag/Model中提取。如果我需要自定义单个视图,我可以在控制器操作上使用actionfilter。Sortof,是的。您将有两个辅助对象。一个用于呈现头部标记第二个助手,你可以把它放在你的视图/布局中的任何地方。你没有说你在一个给定的页面上有多个广告,所以我没有解释。如果你也需要的话,这是非常简单的。这是有道理的。让我感到困惑的是,在没有太多东西的情况下内联抛出第三方Javascript小部件是非常常见的我试图在这里应用同样的想法,但你是对的,创建将在多个页面上运行的脚本属于基本控制器,视图负责显示项目。你有任何好的示例来说明基本控制器和操作过滤器是如何工作的吗?
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;
    }
}