簡體   English   中英

在jQuery動態添加的ASP.Net控件上執行回發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM