我正在用asp.net MVC构建一个简单的CMS,并且我几乎可以使用所有部件。我有一个小问题,我无法解决如何解决。我有一个呈现区域内容的Html帮助器方法。然而,此方法使用Response.Write
来编写其内容而不是返回字符串。原因是我正在执行部分请求,因此没有要返回的字符串。HtmlHelper使用ViewContext.Writer不能正确呈现
我的模板的身体看起来是这样的:
<body>
<h1>Default Template</h1>
<% Html.ContentArea("Main"); %>
</body>
我遇到的问题是,内容呈现H1标签上面。我的理解是,h1应该已经在回复中,因此我要求response.Write()
将在此之后追加内容。这显然不会发生。我在这里错过了什么。
我以前用过partial requests,它们总是在正确的位置渲染。我还没有使用它们与MVC 2,这可能是问题。
以下是内容区域扩展方法。小部件渲染方法各不相同,并且是发生部分请求的地方。然而,即使容器标签的开始和结束都在h1之上呈现,所以它必须是我做错的根本。
public static void ContentArea(this HtmlHelper htmlHelper, string areaName)
{
var container = new TagBuilder("div");
container.GenerateId(areaName);
container.AddCssClass("content-area");
var response = htmlHelper.ViewContext.HttpContext.Response;
response.Write(container.ToString(TagRenderMode.StartTag));
var pageWidgets = htmlHelper.ViewData[areaName] as IList<PageWidget>;
if (pageWidgets != null)
foreach (var widget in pageWidgets)
{
widget.GetInstance().Render(new WidgetContext(htmlHelper.ViewContext, widget));
}
response.Write(container.ToString(TagRenderMode.EndTag));
}
这也可能是一些简单...是不是总是:)
编辑:
即使下面不正确渲染采取先前的评论使用ViewContext.Writer
,而不是毫无区别。
public static void ContentArea(this HtmlHelper htmlHelper, string areaName)
{
var container = new TagBuilder("div");
container.GenerateId(areaName);
container.AddCssClass("content-area");
var writer = htmlHelper.ViewContext.Writer;
writer.Write(container.ToString(TagRenderMode.StartTag));
writer.Write(container.ToString(TagRenderMode.EndTag));
}
这使得作为
<div id="Main" class="content-area"></div>
<h1>Default Template</h1>
感谢,
伊恩
请告诉我们您的扩展方法。 – SLaks 2010-08-30 11:41:53
@SLaks我添加了代码让我知道你是否需要更多。虽然如前所述,每个小部件渲染方法都不相同,所以我没有包含它们 – madcapnmckay 2010-08-30 11:50:00
它可能是'新的WidgetContext(..)'行?也许会创建一个新的响应“流”,而不是使用现有的响应。我这样说,但还没有测试我的假设。 – 2010-08-30 12:12:20