我有一个运行在ASP.Net下的网站。它有一些ascx控件,每个控件都代表不同的页面。母版页将在ascx上调用LoadControl()
,然后将其添加到面板。然后,ascx Page_Load()
会将个人保存功能挂接到页面上的事件,以便母版页上的“保存”按钮可以做正确的事情。这一切都工作。对jQuery动态添加的ASP.Net控件执行回发
我现在正在努力变得更加动态,并更多地使用jQuery,并在客户端做更多的事情。为此,我正在尝试动态加载ascx控件。我们的目标是能够对每个ascx进行最小限度的更改。我有一个页面,其内容如下(编辑为了简洁):当用户点击一个标签上
<head>
<script language="javascript" type="text/javascript">
function documentMetadataLoad()
{
jQuery.ajax({
type: "GET", //GET
url: "JQueryHandler.ashx?Operation=LoadPage&Name=/UserControls/DocumentManagment/DocumentMetadata.ascx",
dataType: "html",
cache: false,
success: function (response)
{
$('#property_tab').html(response);
},
error: function()
{
debugger;
$('#property_tab').html('error');
}
});
</script>
</head>
<body id="mainBody" class="bodyClass">
<form id="form1" runat="server">
<div id="btn_save">
<a href="#" id="btnSave" class="topBtnText">Save</a>
</div>
<div>
<div id="tab1" onclick="documentMetadataLoad(); ">Properties</div>
</div>
<div id="property_tab" style="display: Block;"></div>
</form>
</body>
此页面将动态加载称为DocumentMetadata.ascx控制。 (是的,我知道客户端通过控制路径时可能存在一个严重的安全漏洞,但这是一个概念验证。)
JQueryHandler将采用给定的路径并生成一个页面。它ProcessRequest()
看起来是这样的:
public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString["Operation"] == "LoadPage")
{
String strPath = context.Request.QueryString["Name"];
using (TisPage MyPage = new TisPage())
{
HtmlForm f = new HtmlForm();
f.Action = context.Request.UrlReferrer.AbsolutePath;
UserControl userctrl = MyPage.LoadControl(strPath) as UserControl;
f.Controls.Add(userctrl);
MyPage.Controls.Add(f);
context.Server.Execute(MyPage, context.Response.Output, true);
}
}
}
(谢谢http://www.infoconcepts.com/rendering-ascx-files-ajax/用于指示HtmlForm控件换行控制)TisPage是System.Web.UI.Page的子类,以保存数据的添加事件, ascx期望。
现在,我遇到的问题是我希望DocumentMetadata.ascx在用户按下#btnSave时调用其保存函数。这是背后的代码,它期望保留它的视图状态。所以我认为我必须有回传。我不想用传入的参数来重写C#保存函数作为它自己的ashx调用;有很多这样的页面,重写它们都是不值得的。
我在DocumentMetadata.ascx中有以下代码来设置按钮按下来执行某些操作。
$(document).ready(function()
{
$("#btnSave").bind("click", Save);
});
function Save()
{
debugger;
__doPostBack('ctl00', null);
}
我尝试由具有在Javascript来__doPostBack()
一个电话,但后来我得到的错误:“视图状态MAC验证失败如果此应用程序由网络场或群集承载,请确保配置指定了相同的validationKey和验证算法,AutoGenerate不能在集群中使用。“作为一个实验,我试图从我的web.config中删除我的机器密钥配置,但这似乎没有帮助。
有没有一种方法可以使用JavaScript来调用jQuery加载的ascx控件背后的代码?
您不能使用通过ajax加载的控件的回发方法。我建议将所有这些回发方法转换为类并使用Web服务/方法与它们进行通信。这需要一些时间,但从长远来看,您将拥有更清洁/更快速/多功能的应用程序。 – 2013-05-14 18:33:17
我同意,如果代码被转移到Web服务中,一切都会变得更好,但是页面数量太多却让人望而却步。解决方法是继续为这些页面使用旧界面,但对新页面使用jQuery Ajax方法。 你有一个引用,指出回发不能在ajax加载控件中使用吗?我希望能够向我的老板展示一份正式声明。 – 2013-05-14 22:23:17