0

次の手順を実行します。

  1. チェック ボックスの値のリストを取得し、JavaScript で文字列配列にします。
  2. 配列を取得し、サーバー側関数に送信します。
  3. 配列サーバー側を取り、それを DataTable にします。
  4. DataTable を受け取り、それを TVP としてストアド プロシージャに送信します。

これをサーバー側から機能させることができました。私が問題を抱えているのは、JavaScript からサーバーへの移行です。

現在のコードでは、次のエラーが発生します。

構造化タイプに十分なフィールドがありません。構造化タイプには、少なくとも 1 つのフィールドが必要です。

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

0

渡すデータを表すには、javascript のサブセットであるJSONを使用することをお勧めします。JSON の例は次のようになります。

[ "string1", "string2" ]

また

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

<script>1 つ目は有効な JavaScript 配列で、2 つ目はタグでブラウザに直接渡された場合の有効な JavaScript オブジェクトです。JQueryには JSON を処理するためのさまざまな方法があり、.NET 側でJSON.NETまたはServiceStack.Textを参照して、JSON を C# オブジェクトに逆シリアル化することができます。

[編集]

ただし、JSON を C# に逆シリアル化するのは難しいことを指摘しておく必要があります。これは、クライアントで必ずしも必要ではないプロパティが多数あるDataTableためです。DataTableあなたの最善の策は、 a にデシリアライズし、List<T>そのリストを繰り返して、DataTable必要に応じて行に追加することです。

于 2013-08-02T21:44:03.963 に答える