4

我的頁面上有(服務器端的按鈕)提交按鈕。ASP.NET/JavaScript - 腳本註冊/重定向問題

這裏是我的Click事件代碼:

protected void SubmitButton_Click(object sender, EventArgs e) 
{ 
    db.SaveSomething(); 
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData"); 
    Response.Redirect("SomeOtherPage.aspx"); 
} 

現在的問題是,我使用JavaScript Page.ClientScript.RegisterStartupScript註冊,但這個不會有任何效果的頁面沒有被回發重新渲染(這哪裏是腳本將被執行),因爲不是Response.Redirect發生。

我能想到的唯一解決方案是讓頁面重定向到「知道」即時嘗試執行一些JavaScript,無論是QueryString,HttpContext.Current.Items或(gulp)Session。

  • QueryString - 不是一個選項,因爲它是JavaScript即時試圖執行。
  • HttpContext.Current.Items - 也不是一個選項,因爲我在做一個Response.Redirect(它失去了請求級別的數據,而且我也不能使用Server.Transfer,因爲這對於URL重寫來說不會很好)。
  • 會議 - 當然,但效果並不理想。

任何其他的想法/建議?

編輯澄清:

JavaScript的執行IM是一個Facebook的客戶端API調用發佈到用戶的牆。它必須在客戶端完成。我傳遞給腳本的東西,如「標題」,「消息」,「行動鏈接」等基本上是一堆JSON。但關鍵在於這個數據是在回發時創建的,所以我不能在客戶端單擊執行此功能。

所以即時通訊嘗試完成的是提交按鈕點擊,執行一些JavaScript並做一個重定向(不必按順序,只需要發生)。

+0

如果您可以描述您嘗試完成的「什麼」,那將是很好的,因爲可能有更好的解決方案。有很多方法可以解決這個問題,但也有很多方法可能不適合您的特定情況。 – Josh 2010-08-25 02:15:29

+0

@Josh - 擴大了問題。好點? – RPM1984 2010-08-25 02:19:07

+0

跨頁面回發不是一個選項嗎? – 2010-08-25 02:33:43

回答

5

我認爲你所經歷的是兩種不同範式的不幸碰撞。一方面你有一個你想利用的AJAX風格的API,另一方面你有ASP.Net頁面回發模型。

現在,雖然這兩者並不相互排斥,但它可能帶來一些挑戰。我同意Dan,你最好的選擇是向AJAX方法傾斜一點,而不是反其道而行。

ASP.Net的一個很好的功能是能夠將頁面中的單個靜態方法轉換爲僞Web服務。然後,您可以使用ScriptManager生成客戶端代理類來爲您調用該方法,但可以使用whatever client side library you want

一個很簡單的例子:

在你的代碼隱藏你第

[WebMethod] 
public static Person GetPerson(Int32 id, String lastName) 
{ 
    return DataAccess.GetPerson(id, lastName); 
} 

如果您正在使用ASP.Net AJAX庫來處理這個給你,那麼你就需要啓用頁面方法生成客戶端代理。

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> 
</asp:ScriptManager> 

然後,你可以調用來自客戶端腳本像這樣:

function CallGetPerson() 
{ 
    var id = $get("txtPersonId").value; 
    var lastName = $get("txtLastName").value; 
    // PageMethods is a class that is part of the ASP.Net AJAX 
    // client-side libraries and will contain your auto-generated 
    // proxy methods for making XHR requests. 
    PageMethods.GetPerson(id, lastName, OnGetPersonComplete); 
} 

function OnGetPersonComplete(result) 
{ 
    faceBookApi.DoSomeStuffWithJson(result); 
    window.location = "NewPage.aspx"; 
} 

現在再次,這是一個人爲的例子,以及你正在發佈到服務器可能很複雜,但您可以瞭解使用內置框架組件可以實現的功能。

我希望這會有所幫助。

+0

謝謝。是的,我知道如何使用ajax頁面方法,但問題是,表單很複雜(很多領域,很多其他邏輯),我必須將所有這些邏輯封裝在web方法中 - 這並不理想,此刻我所傾向的是將這個表單封裝在UpdatePanel中,並且這樣做(舊式ajax,相對於正確的方式,這就是你所說的),這就是說,這是一個很好的答案(upvotes顯示),所以生病給你的答案 – RPM1984 2010-08-25 03:29:15

+0

我擔心這種形式可能太複雜,但也許這這是做好一些重構的好動機,使用部分頁面回傳是做這件事的一種低摩擦的方式,但是可以建議您需要使用ScriptManager.RegisterStartupScript,因爲Page.ClientScript在部分回發期間不起作用,因爲只有更新面板內容被刷新。 – Josh 2010-08-25 03:39:46

2

如果您使用Response.Redirect,則不會執行您在上一行註冊的java腳本。我想你想點擊提交按鈕後,做的是:

  1. 保存的東西
  2. 執行JavaScript
  3. 重定向到另一個頁面

在這裏,你可以使用:

protected void SubmitButton_Click(object sender, EventArgs e) 
{ 
    db.SaveSomething(); 
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData"); 
    Page.ClientScript.RegisterStartupScript("window.location.href=XXXXXX"); 
} 

也就是說,使用JavaScript頁面重定向,而不是Response.Redirect

+0

我想到了這一點,但是會重新渲染頁面,然後在頁面加載完成後進行重定向。不適用UX IMO – RPM1984 2010-08-25 02:21:01

+0

當您單擊提交按鈕時,當然會刷新頁面。所以你不想清爽? – 2010-08-25 02:26:36

+0

你不理解。在提交按鈕點擊第一頁時,這會回發給服務器,然後服務器執行一個Response.Redirect - 因此會呈現SECOND頁面。所以它不刷新相同的頁面(如果我沒有Response.Redirect,默認情況下會發生),它會呈現第二頁。明白我的意思了嗎? – RPM1984 2010-08-25 02:28:47

0

你能在第二頁上運行的JavaScript?

除此之外,您的選擇是有限的。您可以使用AJAX從服務器獲取所需的數據,然後重定向。這將改善用戶體驗,因爲至少你不會有額外的頁面加載來運行你的中介JavaScript。


另一種選擇是使用Server.Transfer(...),其工作方式類似於Response.Redirect,但它並沒有一個重定向頭髮送到客戶端。它只是告訴服務器「停止運行當前頁面並開始執行新頁面」。 Context.Items將保持在兩個類之間的範圍內,因爲您只是轉移響應請求的責任,而不是請求的整個上下文。


你也可以結合這兩個解決方案。使用Server.TransferContext.Items值保留在範圍內,然後使用您在第一頁保留的任何值在第二頁上呈現JS。

+0

謝謝。我試過Server.Transfer和HttpCOntext.Current.items(正如我的問題所述),但我遇到了URL重寫問題(Server.Transfer wouldnt與「〜/ somecleanurl」,它必須是「〜/ pages/somepage.aspx「。但我沒有想到AJAX,可能會給你一個去。 – RPM1984 2010-08-25 03:00:08