Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在第一次加载时将数据从javascript发送到代码隐藏_C#_Javascript_Asp.net - Fatal编程技术网

C# 在第一次加载时将数据从javascript发送到代码隐藏

C# 在第一次加载时将数据从javascript发送到代码隐藏,c#,javascript,asp.net,C#,Javascript,Asp.net,实际上,我正在构建一个web应用程序,我需要获取查看该应用程序的机器的本地环境的数据。为此,我使用了一些javascript脚本,如: <script language="javascript"> function GetUserName() { //Permits to get username of client machine var wshell = new ActiveXObject("WScript.Shell"); var arpege = ws

实际上,我正在构建一个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 />
但我只是在帐户中得到了“

谢谢你的帮助


Quentin

在将任何数据发送到客户端之前,服务器端会发生页面加载

加载页面后,如果不启动新回发,则无法执行此操作

解决方案即将出现

编辑:

因此,使用一些方法来实现这一点是可能的

并在服务器端捕获它:

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

沃思,这是一次机会

Shai提出的主张的变体可能是: 在隐藏按钮上生成异步回发

这样,逻辑就可以从页面加载中分离出来 而是放入附加到生成asyncpostback的输入的处理程序中

我不喜欢在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
在服务器上以及所有浏览器上工作。

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>
我所知道的将数据从客户端发送到服务器的最佳(最简单)方法是

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;" />
代码隐藏

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

    MyServerMethod(myHf.Value);
}

我认为这样做比使用页面加载和提交表单要好,因为如果你做的足够多,页面加载方法可能会变得巨大。但这只是我的观点。

这不会导致无限回发循环吗?@Rawling,是的,观点很好,但我相信他能想出一个解决方案,因此它只会执行一次(从客户端读取一个
HiddenField
的值并根据它进行操作)是的,我有一个无限回发循环,所以脚本执行得很好,但arpege的值为null。我无法在页面加载中使用“environment.username”获取用户名因为当我在服务器上部署它时,我得到的是服务器的名称,而我想要的是客户端计算机的名称。如果我使用User.Identity.name,我可以得到客户端计算机的名称?是的,
Environment。UserName
是应用程序标识。但是,
User.Identity.Name
是登录的用户名。若要获取客户端的主机名,请使用。是否需要为“User.Identity.Name”指定一个程序集?因为编译器无法识别它。现在,Request.UserHostName在本地不起作用,我得到了null。这在服务器上会起作用吗?出于好奇,您是否尝试过通过Request.ServerVariables[“AUTH_user”]属性在服务器上获取本地用户?不,我从未使用Request.ServerVariables…@Zachary,这就是
User.Identity.Name
的作用。你想在asp.net中的页面加载事件之前从javascript中获取值吗
protected void Page_Load(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(hdnUser.Value))
        {
            hdnRun.Value = "false";

            lblSayHello.Text = String.Format(@"Hello, {0}", hdnUser.Value);
        }
    }
<asp:HiddenField ID="myHf" class="myHf" runat="server" />

<asp:Button ID="myButton" class="myButton" runat="server" OnClick="myButton_Click" style="display: none;" />
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);
}