2010-08-30 100 views
0

我正在用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> 

感谢,

伊恩

+0

请告诉我们您的扩展方法。 – SLaks 2010-08-30 11:41:53

+0

@SLaks我添加了代码让我知道你是否需要更多。虽然如前所述,每个小部件渲染方法都不相同,所以我没有包含它们 – madcapnmckay 2010-08-30 11:50:00

+0

它可能是'新的WidgetContext(..)'行?也许会创建一个新的响应“流”,而不是使用现有的响应。我这样说,但还没有测试我的假设。 – 2010-08-30 12:12:20

回答

1

您是否尝试过使用ViewContext.Writer.Write而非的Response.Write?我认为这就是我在扩展方法中使用的方式,而且我没有任何问题。

+0

我已经尝试了两种,他们产生完全相同的输出。我已经包含了一个简化的方法,也可以产生相同的结果。 – madcapnmckay 2010-08-30 12:33:14

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>