如何在ASP.NET应用程序背后的客户端Javascript和C#代码之间传递数据?


21

我正在寻找在ASP.NET应用程序背后的客户端JavaScript代码和C#代码之间传递数据的最有效/标准方式。我一直在使用以下方法来实现此目的,但是它们都感觉有些偏软。

要将数据从JavaScript传递到C#代码,是通过设置隐藏的ASP变量并触发回发:

<asp:HiddenField ID="RandomList" runat="server" />

function SetDataField(data) {
      document.getElementById('<%=RandomList.ClientID%>').value = data;
}

然后在C#代码中收集列表:

protected void GetData(object sender, EventArgs e)
{
      var _list = RandomList.value;
}

回到另一种方式,我经常使用ScriptManager来注册一个函数并在Page_Load期间将其传递数据:

ScriptManager.RegisterStartupScript(this.GetType(), "Set","get("Test();",true);

或在回发之前,初始化或预渲染阶段添加属性到控件:

Btn.Attributes.Add("onclick", "DisplayMessage("Hello");");

这些方法很好地为我服务并完成了工作,但感觉并不完整。在客户端JavaScript和C#后端代码之间传递数据的方法是否更标准?

我见过像一些帖子这样一个描述的HtmlElement类; 这是我应该研究的东西吗?



取决于您在服务器和客户端之间传递数据的含义。如果在渲染页面时知道数据,则添加脚本以创建数据或通过文字或类似形式或其他变体设置json是完全合理的。如果是OTOH,那么您试图使页面与服务器交互而不进行回发,那将是一个完全不同的问题。绝对看看json。
Murph

例如。如果我从客户端启动了一个按钮,该按钮从xml文件中获取了一些数据。然后对C#中的数据进行一些计算。然后,我希望完成的结果以漂亮的javascript图形显示形式显示。多数民众赞成在一次回发中,直到提高回发后,客户才知道结果。
cwc1983

通过该注释,您仍然可以在服务器上执行所有工作-加载/处理/返回-因此,首先,我会这样做。将数据格式化为json,在呈现页面时包括json(文字可以让您执行此操作)。当您使它工作时,您可能想要做一些更异步的操作-但这将是相同的json。
Murph

谢谢大家 在阅读了这里的建议并进行了一些额外的研究之后,我发现了一种实现自己想做的新方法。我得到的主要问题是,当我执行Ajax帖子时,无法获得客户端代码来记住程序所在的位置。我现在使用的是JQuery $ Ajax.Post,因为它会在on Success上发回给客户端以保存会话数据。
cwc1983 2012年

Answers:


9

您可以像本例中那样轻松地从JavaScript轻松调用静态页面方法。如果需要从多个页面调用该方法,则可以设置一个Web服务并以相同的方式从Javascript调用它。示例也包括在下面。

.aspx代码

<asp:ScriptManager ID="ScriptManager1" 
EnablePageMethods="true" 
EnablePartialRendering="true" runat="server" />

后台代码

using System.Web.Services;

[WebMethod]
public static string MyMethod(string name)
{
    return "Hello " + name;
}

JavaScript代码

function test() {
    alert(PageMethods.MyMethod("Paul Hayman"));
}

注意:页面方法必须是静态的。对于您而言,这可能会成问题,具体取决于应用程序要执行的操作。但是,如果信息完全基于会话,并且您正在使用某种内置身份验证,则可以在WebMethod装饰器上放置一个EnableSession属性,这将使您可以使用HttpContext.Current.User,会话等


很好的例子,这很好用,我将使用它。谢谢!
Mausimo 2012年

3

我建议看看jQuery。jQuery可以用于向服务器发出AJAX调用,该AJAX可以以您需要的任何格式返回数据-一种好的格式可以是JSON,因为它可以直接在javascript中使用。

要将数据从服务器使用jQuery下拉至javascript ,以下提取将向http://youserver.com/my/uri发出异步请求,并通过提供的函数从服务器接收数据。

$.get("my/uri", 
    function(data) { 
       // client side logic using the data from the server
    })

从javascript发送数据到服务器的工作原理类似:

$.post("my/uri", { aValue : "put any data for the server here" }
    function(data) { 
       // client side logic using the data returned from the server
    })

谢谢,这很好,但是我特别指的是在客户端知道要显示的内容之前先进行回发的情况。如果“结果”是通过c#实现的,那么我该如何“注入”到客户端。
cwc1983

3

微软暗含了UpdatePanel做ajax 的控件,因此可以说这是“标准”方式。我个人不建议使用它,它与丰富的功能集和直接使用JavaScript时所拥有的控制功能相差无几。

这是我个人的方式:

为您要在标准页面回发中使用的任何客户端值创建隐藏字段(即,当用户点击提交时)

<asp:HiddenField ID="selectedProduct" runat="server" />

在后面的代码中注册要使用客户端的控件。

    /* Register the controls we want to use client side */

    string js = "var productBox = document.getElementById('" + selectedProduct.ClientID + "'); ";
    js += "var macCodeBoxBE = document.getElementById('" + beMacCode.ClientID + "'); ";


    ClientScript.RegisterStartupScript(this.GetType(), "prodBox", js, true);

使用javascript库*进行ajax发布/获取,然后根据响应使用JavaScript更新页面

$.get("../ajax/BTBookAppointment.aspx?dsl=" + telNumberBox.value + "&date=" + requiredDate.value + "&timeslot=" + ddTimeslot.value, function (response, status, xhr) {

    if (response.indexOf("not available") > -1) {
        loaderImage.src = "../images/cross.png"
        output.innerHTML = response;
    } });

编写一个单独的“ ajax”页面,该页面将覆盖render方法以完成工作。

protected override void Render(HtmlTextWriter writer)
{
    if (string.IsNullOrEmpty(Request["mac"])) { return; }
    if (string.IsNullOrEmpty(Request["dsl"])) { return; }
    DataLayer.Checkers.BTmacCheckResponse rsp = DataLayer.Checkers.Foo.CheckMAC(Request["dsl"], Request["mac"]);

    writer.Write(rsp.Valid.ToString());
}

*有很多库可供选择,您甚至可以自己滚动库。我会推荐jQuery,它稳定并且具有广泛的功能集。


8
我敢肯定,像在
诸如此类

1
@Raynos生成JavaScript服务器端没有错。
Tom Squire

2
如果您希望服务器执行任何操作,则将HTTP请求(使用XHR)发送到具有敏感数据的敏感URI。从那里,HTTP服务器将知道如何处理它。
雷诺斯2011年

不要在服务器端放置任何JS。它可以在客户端上进行。因此,请输入名称客户端代码。糟糕,大写锁定键卡住了。
snowYetis

3

JSON是完成任务的最佳实践方法。不要将问题视为“ C#和JavaScript”之间的传递。这种思维方式导致代码异常,例如您在原始帖子中的内容。

更一般而言,它只是以一种与语言无关的方式在客户端和服务器之间传递对象。JSON非常适合该任务,因为它得到了广泛的支持并且易于阅读。


2

要设置不需要服务器端ASP的输入标签,可以使用:(或<%#%>用于表单数据绑定)

的HTML:

<input type="hidden" value='<%= RandomValues %>' name="RANDOM_VALUES" />

ASP控件:

<asp:HiddenField ID="RandomList" runat="server" />

获取回发值

Request.Form["RANDOM_VALUES"]

如果其,asp控件隐藏了输入,则可以使用

Request.Form[RandomList.UniqueID]

关于Request.Form的最简洁的部分是,如果您有多个具有相同“名称”属性的标签,它将以CSV格式返回结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.