2012-05-31 71 views
0

我實際上正在構建一個web應用程序,我需要獲取查看應用程序的機器本地環境的數據。爲此,我使用了一個小小的JavaScript腳本,例如:從JavaScript發送數據到第一次加載後的代碼

<script language="javascript"> 
function GetUserName() 
{ 
    //Permits to get username of client machine 
    var wshell = new ActiveXObject("WScript.Shell"); 
    var arpege = wshell.ExpandEnvironmentStrings("%USERNAME%"); 
    document.getElementById("arpege").value=arpege; 
} 
</script> 
<input type=hidden id="arpege" runat=server /> 

我的問題是,頁面加載後,這個腳本被執行,所以我不能用它在頁面加載...

我的頁面加載代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    myConnection.ConnectionString = ActionSource.ConnectionString; 
    myConnection.Open(); 
    String account = arpege.value; 
    ... 
} 

但我只是得到「」帳戶...

感謝您的幫助,

昆汀上之前的任何數據被髮送到客戶端服務器端發生

+0

出於好奇,你是否試圖通過服務器上的Request.ServerVariables [「AUTH_USER」]屬性獲取本地用戶? – Zachary

+0

不,我從來沒有使用過request.ServerVariables .... – Quentin91360

+0

@Zachary,這就是'User.Identity.Name'的用途。 – jrummell

回答

0

的Page_Load。

一旦加載頁面,您無法啓動新的回發程序。

解決方案來了......

編輯:

所以,它(可能)有可能達到這個使用一些jQuery

$(document).ready(function() { 
    var wshell = new ActiveXObject("WScript.Shell"); 
    var arpege = wshell.ExpandEnvironmentStrings("%USERNAME%"); 
    __doPostBack('__Page', arpege); 
}); 

,趕上它在服務器端:

public void Page_Load(object sender, EventArgs e) 
{ 
    string arpege= Request["__EVENTARGUMENT"]; 
} 

值得一試!

+2

這不會導致無限的回發循環嗎? – Rawling

+0

@Rawling,是的,很好,但我確定他可以想出一個解決方案,所以它只會執行一次(從客戶端讀取'HiddenField'的值並根據它執行) – Shai

+0

是,我有一個無限的回發循環,所以腳本執行得很好,但是arpege的值是空的。 – Quentin91360

0

Shai提出的命題的變體可能如下: 在隱藏按鈕上生成異步回覆。

像這樣,邏輯可以從Page_Load中分離出來,而 則放在附加到輸入端的處理程序中,該輸入端產生了異步回送。

我不喜歡在page_load事件中放置太多的邏輯,我覺得很困惑。 雖然

0

實現將會稍微複雜一些,但在Page_Load中獲取用戶名服務器端而不是ActiveX控件。

protected void Page_Load(object sender, EventArgs e) 
{ 
    myConnection.ConnectionString = ActionSource.ConnectionString; 
    myConnection.Open(); 

    String account = User.Identity.Name; 
    // ... 

} 

此外,的ActiveX只能在Internet Explorer - User.Identity.Name作品在服務器上,爲此所有的瀏覽器。

+0

我不能在頁面加載用戶名「environment.username」,因爲當我在我的服務器上部署它我得到服務器的名稱,而我想客戶機的名稱。 – Quentin91360

+0

如果我使用User.Identity.Name,我可以得到客戶機的名稱? – Quentin91360

+0

是的,'Environment.UserName'是應用程序標識。但是,User.Identity.Name是登錄的用戶名。 – jrummell

0

的ASPX代碼:

<body> 
<form id="form1" runat="server"> 
<input type="hidden" id="hdnUser" runat="server" /> 
<input type="hidden" id="hdnRun" runat="server" value="true" /> 
<asp:Label ID="lblSayHello" runat="server" Text="I dont know you"></asp:Label> 
</form> 
<script type="text/javascript"> 
    $(function() { 
     var run = $('#hdnRun').val(); 

     if (run == 'true') { 
      var wshell = new ActiveXObject("WScript.Shell"); 
      $('#hdnUser').val(wshell.ExpandEnvironmentStrings("%USERNAME%")); 
      $('#form1').submit(); 
     } 
    }); 
    </script> 
</body> 

後面的代碼

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!String.IsNullOrEmpty(hdnUser.Value)) 
     { 
      hdnRun.Value = "false"; 

      lblSayHello.Text = String.Format(@"Hello, {0}", hdnUser.Value); 
     } 
    } 
0

,我知道從客戶端將數據發送到服務器的最佳(最簡單的)方法是

1。在ASP隱藏字段商店它

2.點擊一個按鈕,ASP通過javascript

處理在onclick事件

的數據。例如:

ASPX頁

<asp:HiddenField ID="myHf" class="myHf" runat="server" /> 

<asp:Button ID="myButton" class="myButton" runat="server" OnClick="myButton_Click" style="display: none;" /> 

的Javascript

function SendMyData(data) { 
    document.getElementByClassName('myHf').value = data; 
    document.getElementByClassName('myButton').click(); 
    //I use classes since those won't change - IDs become really long and messed up 
    //in the actual page, and may change depending on where the element is placed. 
} 

代碼隱藏

protected void myButton_Click(object sender, EventArgs e) 
{ 
    //Do whatever you want with myHf.Value 

    MyServerMethod(myHf.Value); 
} 

我認爲,做這種方式比使用的Page_Load,並提交表單,只是因爲如果你做了足夠的這些好, Page_Load方法可能會變得很大。但那只是我的個人意見。

相關問題