This question让我想到了如何做相对可撤销的事情:通过javascript无缝集成服务器生成的ASP.NET中的客户端控件HTML。当然,你总是可以使用javascript/jquery /库来创建相同的显示客户端。但是大多数时候,在服务器上执行所有的渲染更容易,而不是将数据传递到必须处理用户界面和渲染的客户端控件。或者,也许你已经有很多交互性较差的服务器代码,你真的不会完全重新使用JavaScript库来添加一些更好的交互性。使用ajax更新ASP.NET服务器呈现的控件
我有一个理论,似乎工作在一个基本的概念证明。假设您想完全重新呈现基于客户端事件的服务器生成的控件的HTML,而不回发。所以使用jQuery,我有一个页面:
default.aspx:
<a id="link1" href="#">Click Here</a>
<div id="container">
<asp:PlaceHolder id="MyPlaceholder" runat="server" />
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#link1').click(function() {
$.ajax({
url: "default.aspx",
type: "GET",
dataType: "html",
async: true,
data: { "ajax": "1" },
success: function(obj) {
// replace the HTML
$('#container').html(obj);
}
});
});
});
事件导致它使用Ajax查询本身。 ,做挂羊头卖狗肉的代码隐藏是这样的:
TestUserControl ctl;
string ajax;
protected void Page_Load(object sender, EventArgs e)
{
ctl = (TestUserControl)Page.LoadControl("TestUserControl.ascx");
Myplaceholder.Controls.Add(ctl);
ctl.OnRender += new TestuserControl.RenderHandler(ctl_Render);
}
protected void Page_PreRender()
{
ajax = Request.QueryString["ajax"] == null ? "" : Request.QueryString["ajax"];
}
void ctl_Render()
{
if (ajax == "1")
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (HtmlTextWriter writer = new HtmlTextWriter(sw))
{
ctl.DoRender(writer);
}
Response.Write(sb.ToString());
Response.End();
}
}
在TestUserControl,我揭露base.render得到输出:基本上
public void DoRender(HtmlTextWriter writer)
{
base.Render(writer);
}
,如果页面被称为没有“Ajax”的查询字符串,它只是像自己一样行事。但是,当使用查询字符串时,它将截取来自我所关心的内容(称为TestUserControl.ascx的用户控件)的输出流,并呈现。这将返回给客户端,客户端会更新HTML。所有的ID都会像以前一样重新创建,因为我不是在单独渲染那个控件,而是在它自己的页面上下文中。理论上讲,ASP.NET创建的每一点魔法都应该被ajax查询重现,检索和更新。
除了效率明显不足之外,它似乎在这个小测试中运行得很顺畅。我可以完全重新使用服务器生成的HTML没有回发的控件,我写了零JavaScript。这个例子实际上并没有改变任何东西,但是传递更多参数来改变输出会很简单。
我想知道有没有人在实践中尝试过这样的事情?我可能没有想到什么潜在的问题?
如果服务器性能不是问题,看起来它可能是一种非常简单的方法,可以通过ASP.NET服务器控件的所有优点获得大量功能。但我似乎无法在实践中找到有关使用这种技术的任何讨论,所以我想知道我可能会错过什么。
你知道,这来自于避免UpdatePanels的愿望,因为有很多方法在将它们与javascript和其他更新面板混合时遇到了麻烦。最后我想我只是想通过后门重新创造一个......好吧。 – 2010-10-28 18:11:15