我有一個運行在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