【问题标题】:How to send a value from client side to server side for server side processing如何将值从客户端发送到服务器端以进行服务器端处理
【发布时间】:2013-01-23 15:40:28
【问题描述】:

我正在尝试使用 javascript 或 JQuery 从客户端向服务器发送一个值(最好是发送到我的代码隐藏中的方法)。我正在使用 C# .net 4.0。

在我的客户端 JQuery 中,我有:

 $.post("test.aspx/testMethod",
        {
            name: "Donald Duck",
            city: "Duckburg"
        }
    );

在我的服务器端 (test.aspx.cs) 方法中,我有

  public void testMethod()
{
    string name = Request.Form("name");
    string city = Request.Form("city");
}

但是这样我得到一个编译错误:“Non-invocable member 'System.Web.HttpRequest.Form' 不能像方法一样使用。”

我该如何纠正这个问题?还是达到相同的目标?使用 $.ajax({...}) 不是一个选项,因为非静态方法需要该值。

【问题讨论】:

  • 考虑使用 ASP.Net MVC。
  • $.post$.ajax 的一种形式,你知道 - 如果你把方法装饰成一个 web 方法,它应该是可能的
  • SLaks - 从未使用过 MVC;根据我的快速研究,看起来您必须从一开始就创建一个 MVC 项目 - 我的 WebForm 项目太深了,现在无法更改。
  • Mark Schultheiss:试过这个... Form 方面仍然无法编译 [System.Web.Services.WebMethod] public void testMethod() { string name = Request.Form("name"); string city = Request.Form("city"); }

标签: javascript jquery c#-4.0 post request


【解决方案1】:

对此有一个非常简单的答案。在搜索了几十个相同的问题以及许多人提供过于复杂的 ajax 回发解决方案之后,我想出了这个。基本上是一个班轮。希望它可以帮助某人:

在您的 javascript 中,您只需调用该方法:

PageMethods.SomeMethod('test');

您的“SomeMethod”将是这样的方法背后的代码:

[WebMethod]
    public static string SomeMethod(string param1)
    {
        string result = "The test worked!";
        return result;
    }

规则: 您必须使用 WebMethod 属性标识方法背后的代码。它必须是静态的。您必须在您的页面中注册一个脚本管理器,如下所示:

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

由于我正在使用 aspx webforms 页面来执行一些非常简单的 JavaScript 功能,例如检索/存储地理位置,因此我根据需要将其放在 Form 元素中。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    我不知道 Web 表单是否支持这种类型的 JSON 请求。我很久以前就尝试过,但那时我必须添加 asmx 文件。目前你有 WCF,但是如果你不想改变你的 webforms 项目并且仍然想要 restful api,那么合并 MVC 项目来完成你的 restful 任务。你不必改变一切,但它可以协同工作。 Here是怎么解释的?

    我不知道最新版本的 Web 窗体,但在 VS2012 之前,您不能对页面进行 ajax 类型调用。据我所知。

    如果需要任何进一步的细节,请告诉我。

    【讨论】:

    • 谢谢大家。 Kunjee:我用的是VS2010,不过有意思的地方。
    • 我猜这是不可能的,你必须添加 asp.net mvc 项目或使用 asmx 文件或 WCF 创建 Web 服务。还有一个不错的选择,您可以使用servicestack.net,它将与您的项目并行工作。看看那个。如果需要更多详细信息,请告诉我。
    • 我已经在 VS2010 中运行了上述代码(但需要进行少量添加以防止价值丢失 - 请参阅我的主要后续答案...
    【解决方案4】:

    找到解决方案...(希望有人觉得它有用)

    JAVA 脚本

    function myFunction() {
    
        var str= "fname=Henry&lname=Ford"; 
        log("MyString=" + str);
    }
    
    function log(message) {
        var client = new XMLHttpRequest();
        client.open("POST", "Default.aspx", true);  // Default.aspx being the page being posted to
        client.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        client.send(message);
    }
    

    C# Default.aspx.cs(Default.aspx 后面的代码)

    protected void Page_Load(object sender, EventArgs e)
    {
        getText();
    }
    
    public void getText()
    {
        if (HttpContext.Current.Request.Form.Keys.Count > 0)
        {
            string code = HttpContext.Current.Request.Form["MyString"];
        // code = "fname=Henry"
        // For looping etc, see below
        }
    }
    

    你还能得到什么......

    HttpContext.Current.Request.Form.Count       // 2
    HttpContext.Current.Request.Form.Keys.Count  // 2
    
    HttpContext.Current.Request.Form.AllKeys[0]  // "MyString"
    HttpContext.Current.Request.Form.Keys[0]     // "MyString"
    HttpContext.Current.Request.Form.AllKeys[1]  // "lname"
    HttpContext.Current.Request.Form.Keys[1]     // "lname"
    
    HttpContext.Current.Request.Form[0]      // "fname=Henry"
    HttpContext.Current.Request.Form[1]      // "Ford"
    

    遍历键...

    foreach (string key in Request.Form.Keys) 
      {
        DoSomething(Request.Form[key]);
      }
    

    【讨论】:

      【解决方案5】:

      上述代码的工作原理是将一个值从客户端 javascript 传递到服务器端代码隐藏,但随后无法使用该值,因为您丢失了它。

      需要对上述代码进行以下修改才能使用该值(本质上将其存储在单独的静态类中,直到需要)。

      C# Default.aspx.cs(Default.aspx 后面的代码)

      protected void Page_Load(object sender, EventArgs e)
      {
          getText();
      }
      
      public void getText()
      {
          if (HttpContext.Current.Request.Form.Keys.Count > 0)
          {   
              // Reset staticValue
              Class1.staticValue = "";
      
              Class1.staticValue = HttpContext.Current.Request.Form["MyString"];
          // Call Class1.staticValue anywhere else and you get expected answer= "fname=Henry"
      
          }
      }
      

      STATIC CLASS (App_Code/Class1.cs) - 另一个存储值的对象(否则 HttpContext 对象会将其从任何东西中删除)

      public class Class1
      {
          private static string myValue = "";
          public Class1()
          {
                  //
              // TODO: Add constructor logic here
              //
          }
      
          public static string staticValue
          {
              get
              {
                  return myValue;
              }
      
              set
              {
                  myValue = value;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多