0

我想做以下步骤:

  1. 获取复选框值的列表,并将它们转换为 JavaScript 中的字符串数组。
  2. 获取数组并将其发送到服务器端函数。
  3. 把阵列服务器端做成DataTable。
  4. 获取 DataTable 并将其作为 TVP 发送到存储过程。

我已经从服务器端开始工作了。我遇到麻烦的地方是从 JavaScript 到服务器。

使用我当前的代码,我收到此错误:

结构化类型中没有足够的字段。结构化类型必须至少有一个字段。

如何将 JavaScript 数组传递给 Web 方法?

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</form>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Web.Script.Services;
using System.Web.Services;


    namespace SendTVP
    {
        public partial class _default : System.Web.UI.Page
        {
            //page variables
            string filterList = string.Empty;
            DataTable dt = new DataTable();
            protected void Page_Load(object sender, EventArgs e)
            {

            }
            protected void Button1_Click(object sender, EventArgs e)
            {

                string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
                using (var con = new SqlConnection(cs))
                {
                    using (var cmd = new SqlCommand("spFilterPatientsByRace",con))
                    {
                        con.Open();
                        cmd.CommandType = CommandType.StoredProcedure;
                        SqlParameter param = new SqlParameter();
                        //required for passing a table valued parameter
                        param.SqlDbType = SqlDbType.Structured;
                        param.ParameterName = "@Races";
                        //adding the DataTable
                        param.Value = dt;
                        cmd.Parameters.Add(param);
                        GridView1.DataSource = cmd.ExecuteReader();
                        GridView1.DataBind();
                    }                
                }
            }
            [ScriptMethod]
            [WebMethod]
            //this method will take JS array as a parameter and turn it into a DataTable

            public void TableFilter(string filterList)
            {
                DataTable filter = new DataTable();
                filter.Columns.Add(new DataColumn() { ColumnName = "Races" });
                dt.Columns.Add(new DataColumn() { ColumnName = "Races" });
                foreach (string s in filterList.Split(','))
                {
                    filter.Rows.Add(s);
                }
                dt = filter;
            }
        }

}

如果这是一种完全愚蠢的方法,那么非常欢迎修改:)

4

2 回答 2

1

这里的问题是您的网络表单上有两种方法需要回发周期。

  • 当你调用 时WebMethod,它会创建一个_default类的实例并设置dt变量,但什么也不做。
  • 当您调用 时,会创建该类Button1_Click的新实例,因此变量设置为。因此,您的参数没有列或其他数据。_defaultdtnew DataTable();

您将希望DataTable在一种方法中进行处理,大概是该TableFilter方法。

于 2013-08-02T22:06:07.543 回答
0

我建议使用JSON(javascript 的一个子集)来表示您传递的数据。JSON 的一个例子是:

[ "string1", "string2" ]

或者

{ "property1": "a", "property2": "b" }

<script>其中第一个是有效的 javascript 数组,第二个是在标签中直接传递给浏览器时的有效 javascript 对象。JQuery有多种处理 JSON 的方法,您可以查看.NET 端的JSON.NETServiceStack.Text以将 JSON 反序列化为 C# 对象。

[编辑]

虽然我应该指出,很难将 JSON 反序列化为 C# DataTable,因为DataTable它有很多您不一定需要在客户端上的属性。您最好的选择是反序列化为 aList<T>并根据需要遍历该列表添加到DataTable行中。

于 2013-08-02T21:44:03.963 回答