2010-04-28 61 views
1

我想要获取以前在完整的.aspx页面上存在的一堆代码,并在.ashx处理程序中执行相同的操作。使用ASP.Net服务器控件代码生成.ashx

代码创建了一个HtmlTable对象,向这些行添加了行和单元格,然后将.aspx控件集合添加到html表中,然后将其添加到页面上已有的div。

我试图保持代码的机智,但不是将控件放入div中,而是实际生成html,然后我将在可通过AJAX客户端调用的大块文本中返回该代码。

当我尝试使用InnerHtml属性(表示它不支持)时出现HtmlTable错误,并且当我尝试RenderControl时,在首先创建一个TextWriter和一个HtmlTextWriter对象之后,出现页面不能为空的错误。

有没有人做过这个?有什么建议么?

回答

2

*最近的是上面。

OK,甚至在马特的更新是有解决办法;)

首先,我们必须使用一个页面,里面form。否则,我们将无法添加ScriptManager控件。还有一件事:ScriptManager控件应该是表单中的第一个控件。进一步更容易:

Page page = new Page(); 
Button button = new System.Web.UI.WebControls.Button 
{ 
    ID = "btnSumbit", 
    Text = "TextButton", 
    UseSubmitBehavior = true 
}; 
HtmlForm form = new HtmlForm 
{ 
    ID="theForm" 
}; 
ScriptManager scriptManager = new ScriptManager 
{ 
    ID = "ajaxScriptManager" 
}; 
form.Controls.Add(scriptManager); 
form.Controls.Add(button); 
page.Controls.Add(form); 

using (StringWriter output = new StringWriter()) 
{ 
    HttpContext.Current.Server.Execute(page, output, false); 

    context.Response.ContentType = "text/plain"; 
    context.Response.Write(output.ToString()); 
} 

这个工程。输出是相当大的,所以我决定不包括它到我的答案:)


其实,有一个解决方法。是的,我们可以在处理程序中进行控制。

首先,我们需要一个无页面。因为没有它,我们得到:

控制类型“按钮”的“btnSumbit” 必须放在一个表单标签内有 RUNAT =服务器。

public class FormlessPage : Page 
{ 
    public override void VerifyRenderingInServerForm(Control control) 
    { 
    } 
} 

其次,没有人能阻止我们创造我们FormlessPage页面的一个实例。现在让我们在那里添加一个控件(我决定添加一个Button控件作为示例,但您可以使用任何控件)。

FormlessPage page = new FormlessPage(); 
Button button = new System.Web.UI.WebControls.Button 
{ 
    ID = "btnSumbit", 
    Text = "TextButton", 
    UseSubmitBehavior = true 
}; 
page.Controls.Add(button); 

第三,让我们捕捉输出。为此,我们使用HttpServerUtility.Execute方法:

执行在当前 请求的上下文中指定 虚拟路径的处理程序。甲 System.IO.TextWriter捕获输出 从执行处理程序和一个 布尔参数指定是否 清楚 System.Web.HttpRequest.QueryStringSystem.Web.HttpRequest.Form 集合。

下面是代码:

using (StringWriter output = new StringWriter()) 
{ 
    HttpContext.Current.Server.Execute(page, output, false); 

    context.Response.ContentType = "text/plain"; 
    context.Response.Write(output.ToString()); 
} 

结果将是:

<input type="submit" name="btnSumbit" value="TextButton" id="btnSumbit" />

另外,我可以推荐ScottGu的文章Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios。希望,你可以在那里找到很多有用的东西。

+0

这对于我需要的90%很好,所以非常感谢你。但是,我还剩下1条绊脚石。有Telerik控件需要在这里呈现。我可以添加控件,但是他们需要一个脚本管理器,或者它在渲染时会爆炸。我已经尝试在页面中添加一个作为控件,但是随后出现了未设置为实例的对象错误。 – 2010-04-28 20:57:36

相关问题