2011-10-06 97 views
1

我在其中一個頁面中使用了Ajax選項卡控件。它有一個主控用戶控制,其中有三個選項卡。 這三個選項卡已由三個單獨的用戶控件填充。 這些用戶控件有一些控件和一個保存按鈕來保存數據。 我的問題是,如果用戶在當前選項卡的用戶控件中有任何未保存的更改,我必須阻止用戶從選項卡導航。我不得不問他有沒有未保存的變化,你想保存它們嗎?並根據用戶的反應必須採取進一步行動。 我可以使用TabControl的OnClientActiveTabChanged事件打開Pop並詢問未保存的更改。我在確切知道哪個標籤的數據未保存時面臨問題。我無法追蹤當前標籤,從哪個用戶試圖導航離開。任何人都可以幫助我保持當前標籤的名稱,以便每當用戶點擊任何其他標籤時,我將知道哪個標籤的數據我必須保存並且可以從我的主用戶控件中激發相應用戶控件的保存功能。Ajax選項卡控件中的選項卡更改事件

請找到下面的代碼樣本相同:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MasterUserControl.ascx.cs" 
    Inherits="TabbedSolution.MasterUserControl" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> 
<%@ Register Src="UserControl1.ascx" TagName="UserControl1" TagPrefix="uc1" %> 
<%@ Register Src="UserControl2.ascx" TagName="UserControl2" TagPrefix="uc2" %> 
<%@ Register Src="UserControl3.ascx" TagName="UserControl3" TagPrefix="uc3" %> 
<div> 
    <asp:TabContainer ID="TabContainer1" runat="server" 
    AutoPostBack="true" OnClientActiveTabChanged="chechUnsavedChanges" OnActiveTabChanged="tabChanged"> 
     <asp:TabPanel ID="TabPanel1" runat="server" HeaderText="Panel1" > 
      <ContentTemplate> 
       <uc1:UserControl1 ID="UserControl11" runat="server" /> 
      </ContentTemplate> 
     </asp:TabPanel> 
     <asp:TabPanel ID="TabPanel2" runat="server" HeaderText="Panel2"> 
      <ContentTemplate> 
       <uc2:UserControl2 ID="UserControl21" runat="server" /> 
      </ContentTemplate> 
     </asp:TabPanel> 
     <asp:TabPanel ID="TabPanel3" runat="server" HeaderText="Panel3"> 
      <ContentTemplate> 
       <uc3:UserControl3 ID="UserControl31" runat="server" /> 
      </ContentTemplate> 
     </asp:TabPanel> 
    </asp:TabContainer> 
</div> 

回答

2

試一試在你的tabchanged javascript函數

var container = $find('TabContainer1'); 
var activeTab = container.get_activeTabIndex(); 

我不知道沒有jQuery的方式,但爲什麼用javascript jquery的無呵呵:)

ps:我還沒有測試過這個解決方案,但是應該可以工作

+0

感謝您的決議,但仍然沒有運氣.. 我試過了。 PFb功能: 函數checkUnsavedChanges(){ 調試器; var container = document.getElementById(「<%= TabContainer1.ClientID%>」); var container1 = $ find(「<%= TabContainer1.ClientID%>」); var container2 = $ find('TabContainer1'); var activeTab =容器。get_activeTabIndex();警報(容器); 警報(容器); alert(container1); alert(container2); } 沒有結果出警報 – Chat

+0

你試過alert(container.toString());或警報(JSON.stringify(容器));或alert(activeTab.toString());也許如果我在週末有一些時間,我會自己嘗試一下,我現在正在工作:p – BBQ

+0

是的,沒問題。將嘗試與.ToString()。將給它一些更多的嘗試我的結局以及.. – Chat

2

在我看來,如果你能得到當前的活動標籤索引並將其存儲在會話中,那應該可以工作。這就是我爲多視圖activeviewindex等onclick事件爲asp.net控件做的事情。我得到的頁面加載完成事件的值,以保存用戶刷新等當前視圖

我發現,使用多視圖與更新面板和一個小圖形genious使它看起來像一個選項卡,可以使一個可以點擊鏈接按鈕的選項卡控件,因此您可以按照這種方式設置會話....設置onclick並在加載完成時檢索。

EX: Session("whichTab") = myTabControl.activetabindex on click and whatever = Session("whichTab") on load complete for curent page。

注:我做這一切的背後

VB.net代碼這會告訴你,當用戶更改標籤哪一個是他或她以前在。當然,你必須找到爲你的應用程序執行此操作的最佳方法,並查看標籤控件選項卡如何似乎沒有服務器側單擊事件,而是使用多視圖。如果有人可以糾正我的點擊事件請做。雖然我剛開始使用它,但我並沒有真正看過控制器的規格,而是我如何到達這裏。

希望這會有所幫助。

+0

這是一個很棒的解決方案。你介意分享一些代碼嗎?我很高興看到/聽到關於本地語言的解決方案,而不是插入,敲擊或使用java腳本或jquery或其他東西來解決在本地語言中可以做什麼。 BIG投票。我知道有時候需要其他的語言,在少數情況下會讓一些事情變得更容易。但我總是試圖留在本地語言。 – htm11h