我正在使用asp.net MVC构建一个简单的CMS,我几乎所有部分都在工作。我有一个小问题,我无法解决如何解决。我有一个Html辅助方法,用于呈现区域的内容。但是,此方法使用Response.Write
来写入其内容而不是返回字符串。原因是我正在执行部分请求,因此没有要返回的字符串。
我的模板正文如下:
<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>
谢谢,
伊恩
答案 0 :(得分:1)
您是否尝试过使用ViewContext.Writer.Write而不是Response.Write?我认为这是我在扩展方法中使用的,我没有任何问题。
答案 1 :(得分:0)
为挖掘一年之久的问题道歉,但我已经实现了OP的代码,我无法在ASP.NET MVC 2上重现这个问题。
在我的视图中有这个...
<body>
<h1>Default Template</h1>
<% Html.ContentArea2("Main"); %>
</body>
...我得到了这个输出:
<body>
<h1>Default Template</h1>
<div class="content-area" id="Main"></div>
</body>