Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Razor视图中动态定义的内容节_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc Razor视图中动态定义的内容节

Asp.net mvc Razor视图中动态定义的内容节,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我正在尝试实现一个想法,我必须允许为我的MVC3Razor站点动态生成用户定义的部分 模板应该是这样的 <div class="sidebar"> @RenderSection("Sidebar", false) </div> <div class="content"> @RenderSection("MainContent", false) @RenderBody() </div> 输出: <div clas

我正在尝试实现一个想法,我必须允许为我的MVC3Razor站点动态生成用户定义的部分

模板应该是这样的

<div class="sidebar">
     @RenderSection("Sidebar", false)
</div>
<div class="content">
     @RenderSection("MainContent", false)
     @RenderBody()
</div>
输出:

<div class="sidebar">Test Content </div>
<div class="content">Main Content <p>Rendered body from view</p></div>
测试内容
主要内容从视图中呈现主体

从这个角度看,创建一个模型似乎很容易
字典

var sectionControls=newdictionary();
sectionControls.Add(“MainContent”,newdictionary())
{ 
{“购物车”,购物车}
});
添加(“侧栏”,新字典()
{ 
{“_headingImage”,pageModel.headingImage},
{u sideNav',null}
});
pageModel.SectionControls=SectionControls;
因此,上面的代码声明了两个模板部分(“MainContent”和一个cart,以及一个带有图像和导航的“侧栏”

因此,现在我的视图包含这样呈现输出的代码

foreach(KeyValuePair<string,Dictionary<string,dynamic>> section in Model.SectionControls)
    {
        DefineSection(section.Key, () =>
        {
            foreach (KeyValuePair<string, dynamic> control in section.Value)
            {
                RenderPartialExtensions.RenderPartial(Html, control.Key, control.Value);
            }
        });
  }
foreach(Model.SectionControls中的KeyValuePair部分)
{
定义节(section.Key,()=>
{
foreach(节.Value中的KeyValuePair控件)
{
RenderPartialExtensions.RenderPartial(Html,control.Key,control.Value);
}
});
}
现在,当我运行这段代码时,两个部分包含相同的内容!单步遍历代码显示加载路径如下

操作返回,上面的代码在视图中运行,LayoutTemplate开始加载。当在布局模板中为这两个部分调用RenderSection时,视图再次运行!我觉得更奇怪的是最终结果是“HeadingImage”和“SideNav”在侧边栏和MainContent部分结束。MainContent部分不包含购物车,它包含侧边栏部分的副本

<div class="sidebar">
<h2><img alt=" " src="..."></h2>
..nav..
</div>
<div class="content">
<h2><img alt=" " src="..."></h2>
..nav..
<p>Rendered body from view</p>
</div>

…导航。。
…导航。。
从视图中渲染实体

注释掉控制器中两个节定义中的一个会导致另一个是唯一的项(但它仍然是重复的!)

以前有没有人遇到过这个问题,或者知道是什么限制导致了这种行为


编辑:太好了。也感谢您的链接!我为支持razor的新版resharper感到难过。

您的lambda表达式共享相同的
部分
变量。
调用任一lambda时,变量的当前值是最后一个部分

foreach(在Model.SectionControls中不使用KeyValuePair)
{
var段=dontUse;
定义节(section.Key,()=>
{
foreach(节.Value中的KeyValuePair控件)
{
RenderPartialExtensions.RenderPartial(Html,control.Key,control.Value);
}
});
}

谢谢,今天这一点让我觉得很有意思。我读了一些书,发现了这一点。访问修改的闭包是我(每个人)都应该理解的。除了使用渲染扩展,您还可以使用
Html.ViewContext.Writer
将您想要的任何内容输出到该部分。
foreach(KeyValuePair<string,Dictionary<string,dynamic>> section in Model.SectionControls)
    {
        DefineSection(section.Key, () =>
        {
            foreach (KeyValuePair<string, dynamic> control in section.Value)
            {
                RenderPartialExtensions.RenderPartial(Html, control.Key, control.Value);
            }
        });
  }
<div class="sidebar">
<h2><img alt=" " src="..."></h2>
..nav..
</div>
<div class="content">
<h2><img alt=" " src="..."></h2>
..nav..
<p>Rendered body from view</p>
</div>
foreach(KeyValuePair<string,Dictionary<string,dynamic>> dontUse in Model.SectionControls)
{
    var section = dontUse;

    DefineSection(section.Key, () =>
    {
        foreach (KeyValuePair<string, dynamic> control in section.Value)
        {
            RenderPartialExtensions.RenderPartial(Html, control.Key, control.Value);
        }
    });
}