C# 在第一次加载时将数据从javascript发送到代码隐藏
实际上,我正在构建一个web应用程序,我需要获取查看该应用程序的机器的本地环境的数据。为此,我使用了一些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
<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);
}