Asp.net mvc Razor视图中动态定义的内容节
我正在尝试实现一个想法,我必须允许为我的MVC3Razor站点动态生成用户定义的部分 模板应该是这样的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
<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);
}
});
}