0

私は実際に Web アプリケーションを構築しており、アプリケーションを表示しているマシンのローカル環境のデータを取得する必要があります。これを行うには、次のような小さな 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;
    ...
}

しかし、私はアカウントに「」を取得します...

ご協力いただきありがとうございます、

クエンティン

4

5 に答える 5

0

ActiveX コントロールではなく、Page_Load でサーバー側のユーザー名を取得します。

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サーバー上で動作するため、すべてのブラウザで動作します。

于 2012-05-31T14:56:56.753 に答える
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"]; 
}

試してみる価値あり!

于 2012-05-31T14:23:35.787 に答える
0

Shai による提案の変形は次のようになります: 非表示のボタンで asyncpostback を生成します。

そのように、ロジックを Page_Load から分離し、代わりに asyncpostback を生成した入力にアタッチされたハンドラーに配置することができます。

page_load イベントにあまりにも多くのロジックを配置するのは好きではありません。紛らわしいと思います。ただし、実装はもう少し複雑になります

于 2012-05-31T14:53:35.973 に答える
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);
        }
    }
于 2012-05-31T15:29:02.837 に答える
0

クライアントからサーバーにデータを送信するために私が知っている最良の (最も簡単な) 方法は、

1.asp隠しフィールドに保存します

2. JavaScript を介して ASP ボタンをクリックします。

3. 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 メソッドが巨大になる可能性があるからです。しかし、それは私の意見です。

于 2012-05-31T21:44:29.117 に答える