[英]Perform postback on ASP.Net control dynamically added by jQuery
我有一個在ASP.Net下運行的網站。 它具有許多ascx控件,每個控件代表一個不同的頁面。 母版頁將在ascx上調用LoadControl()
,然后將其添加到面板中。 然后,ascx Page_Load()
將個人保存功能連接到頁面上的事件,以便母版頁上的“保存”按鈕將執行正確的操作。 一切正常。
我現在試圖變得更加動態,並更多地使用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失敗。如果此應用程序由Web Farm或群集托管,請確保配置指定相同的validationKey和驗證算法。AutoGenerate不能在群集中使用。” 作為實驗,我嘗試從web.config中刪除機器密鑰配置,但這似乎無濟於事。
有沒有一種方法可以使用JavaScript來調用jQuery加載的ascx控件后面的代碼?
通過ajax加載.ascx控件與加載字符串相同。 它是單向管道,並且該控件沒有可用的回發通信。 UpdatePanel解決方案也不起作用(它們也很糟糕 )。
我的建議是使用Mustache.js之類的東西來創建客戶端模板,然后通過ajax加載JSON數據以填充這些模板,並通過Web服務與服務器/數據庫進行ajax通信。 通過分離您的代碼,將更易於維護,您將能夠重用更多代碼,提高效率等。
回發是老式技術,而UpdatePanels只是ajax的討厭實現。 花一些時間為您的應用和您自己做正確的事,因為它,您會變得更好。
如果使用UpdatePanel,則可以更輕松地完成此處的操作。 它在客戶端進行部分回發,並保留ASP頁面生命周期。 您可以使用UpdatePanels包裝#property_tab
和#btnSave
並管理回發事件服務器端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.