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

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

我所知道的将数据从客户端发送到服务器的最佳(最简单)方法是

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 回答
0

Shai 提出的建议的一个变体可能如下:在隐藏按钮上生成异步回发。

像这样,逻辑可以从 Page_Load 中分离出来,而是放在附加到生成 asyncpostback 的输入的处理程序中。

我不喜欢在 page_load 事件中加入太多逻辑,我觉得这很混乱。实现会稍微复杂一些

于 2012-05-31T14:53:35.973 回答
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适用于服务器以及所有浏览器。

于 2012-05-31T14:56:56.753 回答
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 回答