等效于Jquery中的DataTable来存储数据

DataTable equivalent in Jquery to store data?

本文关键字:存储 数据 DataTable 中的 Jquery      更新时间:2023-09-26

我有一个使用Jquery动态添加行的表单。

请看一看:DEMO

现在,我想使用"保存"按钮的Jquery Ajax调用点击事件来保存已添加到数据库中的所有行的数据。我陷入困境的地方是。。我不确定应该如何提取所有行的数据并将其发送到Web方法。我的意思是,如果是c#,我可以在将数据发送到数据库之前使用DataTable来存储所有行的数据。我想我应该创建一个用逗号分隔的字符串,并用每行的数据管道将其发送到webmethod。我不确定这是否是正确的方法,也不确定如何做到这一点(即创建这样一个字符串)。

HTML

<table id="field">
    <tbody>
    <tr id="row1" class="row">
        <td> <span class='num'>1</span></td>
        <td><input type="text" /></td>
        <td><select class="myDropDownLisTId"> <input type="text" class="datepicker" /></select></td><td>
            <input type="submit"></input>
        </td>
    </tr>
    </tbody>
</table>
<button type="button" id="addField">Add Field</button>
<button type="button" id="deleteField">Delete Field</button>
<button type="button" id="btnsave">SAVE</button>

2条建议:

  • 为了保持它与现有的一样接近,您可以将表放在一个表单标记中,然后提交表单(使用类似jQueryForm插件的东西通过Ajax提交)。最棘手的部分是将数据绑定到操作参数。您可以以数组的形式接收它,也可以默认循环使用Request.Form变量的属性。请确保为这些字段生成正确的名称。

  • 我认为最干净的方法是让一个JavaScript对象保存您的值,并用双向绑定从该对象生成表。像KnockoutJS这样的东西会适合你的需求。通过这种方式,用户在表中输入数据,您就可以将其序列化并发送到服务器。下面是我做的一个快速示例。

我不推荐这种方法,但如果你想创建自己的字符串,你可以按照这些思路做一些事情:

$("#btnsave").click(function () {
    var result = "";
    $("#field tr").each(function (iRow, row) {
        $("td input", row).each(function (iField, field) {
            result += $(field).val() + ",";
        });
        result = result + "|";
    });
    alert(result);
});

如果用户键入逗号,您将遇到问题。这就是为什么我们使用众所周知的序列化格式。

在保存按钮事件上使用ajax调用。。。像这个

$(document).ready(function () {
    $('#reqinfo').click(function () {
       // debugger;
        var emailto = document.getElementById("emailid").value;
        if (emailto != "") {

            $.ajax({
                type: "GET",

url:"/EmailService1.svc/EmailService1/emaildata?电子邮件="+emailto,

                // data: dat,
                Accept: 'application/json',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (result) {
                //    debugger;

                },
                error: function (result) {
                   // debugger;
                }
            });
        }
        else {
            //your validation message goes here
            return false;
        }
    });
});

并将所有数据添加到quesry字符串中,然后将其传输到webservice。。

  url: "/EmailService1.svc/EmailService1/emaildata?Email=" + emailto + "data1=" + data1,
<script type="text/javascript">
var _autoComplCounter = 0;
function initialize3(_id) {
    var input_TO = document.getElementById(_id);
    var options2 = { componentRestrictions: { country: 'ID' } };
    new google.maps.places.Autocomplete(input_TO, options2);
}
google.maps.event.addDomListener(window, 'load', initialize3);
function incrementValue() {
    var value = parseInt(document.getElementById('number').value, 10);
    value = isNaN(value) ? 0 : value;
    value++;
    document.getElementById('number').value = value;
}
function GetDynamicTextBox(value) {
    var _id = "AutoCompl" + _autoComplCounter;
    _autoComplCounter++;
    return '<input name = "DynamicTextBox"  type="text" id="' + _id + '" value = "' + value + '" onkeypress = "calcRoute();"  />' +
       '<input type="button" class="superbutton orange" value="Remove" onclick = "RemoveTextBox(this)" />'
}
function AddTextBox() {
    var value = parseInt(document.getElementById('number').value, 10);
    value = isNaN(value) ? 0 : value;
    value++;
    if (document.getElementById('number').value < 3) {
        document.getElementById('number').value = value;
        var div = document.createElement('DIV');
        var _id = "AutoCompl" + _autoComplCounter;
        _autoComplCounter++;
        var ht = '<input name = "DynamicTextBox" type="text" id="' + _id + '" value = "" onkeypress = "calcRoute();" class="clsgetids" for-action="' + _id + '" />' +
       '<input type="button" class="superbutton orange" value="@Resources.SearchOfferRides.btnRemove" onclick = "RemoveTextBox(this); calcRoute();" />';
        div.innerHTML = ht;
        document.getElementById("TextBoxContainer").appendChild(div);
        setTimeout(function () {
            var input_TO = document.getElementById(_id);
            var options2 = { componentRestrictions: { country: 'ID' } };
            new google.maps.places.Autocomplete(input_TO, options2);
        }, 100);
        document.getElementById("TextBoxContainer").appendChild(div);
    }
    else {
        alert('Enter only 3 stop point. !!');
    }
}
function RemoveTextBox(div) {
    //calcStopPointRoute();
    var value = parseInt(document.getElementById('number').value, 10);
    value = isNaN(value) ? 0 : value;
    value--;
    document.getElementById('number').value = value;
    document.getElementById("TextBoxContainer").removeChild(div.parentNode);
}
function RecreateDynamicTextboxes() {
    var values = eval('<%=Values%>');
    if (values != null) {
        var html = "";
        for (var i = 0; i < values.length; i++) {
            html += "<div>" + GetDynamicTextBox(values[i]) + "</div>";
        }
        document.getElementById("TextBoxContainer").innerHTML = html;
    }
}
  //  window.onload = RecreateDynamicTextboxes;
</script>

并从文本框中获取值:

  #region stop point
        string[] textboxValues = Request.Form.GetValues("DynamicTextBox");
        if (textboxValues != null)
        {
            for (Int32 i = 0; i < textboxValues.Length; i++)
            {
                if (textboxValues.Length == 1)
                {
                    model.OptionalRoot = textboxValues[0].ToString();
                }
                else if (textboxValues.Length == 2)
                {
                    model.OptionalRoot = textboxValues[0].ToString();
                    model.OptionalRoot2 = textboxValues[1].ToString();
                }
                else if (textboxValues.Length == 3)
                {
                    model.OptionalRoot = textboxValues[0].ToString();
                    model.OptionalRoot2 = textboxValues[1].ToString();
                    model.OptionalRoot3 = textboxValues[2].ToString();
                }
                else
                {
                    model.OptionalRoot = "";
                    model.OptionalRoot2 = "";
                    model.OptionalRoot3 = "";
                }
            }
        }
        #endregion

简短回答:
javascript中的DataTable等价物是Array of custom object(不完全等价,但我们可以这么说)

您可以滚动自己的DataTable.js类,该类将具有.NET中DataTable类支持的所有函数和属性

长答案:
在客户端(aspx)
定义一个类MyClass,并将所有值存储在该类的对象数组中
然后在stingyfying之后将该数组传递给web方法

JSON.stringify(myArray); 

在服务器端(codebehind)
您只需定义web方法来接受对象列表List<MyClass>

PS:调用web方法时,Asp.net会自动将json数组转换为List<Object>Object[]

Loooong答案(完整解决方案)

页码aspx:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="App_Themes/SeaBlue/jquery-ui-1.9.2.custom.css" rel="stylesheet" type="text/css" />
    <script src="Scripts/jquery-1.8.3.js" type="text/javascript"></script>
    <script src="Scripts/jquery-ui-1.9.2.custom.min.js" type="text/javascript"></script>
    <script src="Scripts/json2.js" type="text/javascript"></script>
    <script type="text/javascript">
        function MyClass(title,option,date) {
            this.Title = title;
            this.Option = option;
            this.Date = date;
        }
        function GetJsonData() {
            var myCollection = new Array();
            $(".row").each(function () {
                var curRow = $(this);
                var title = curRow.find(".title").val();
                var option = curRow.find(".myDropDownLisTId").val();
                var date = curRow.find(".datepicker").val();
                var myObj = new MyClass(title, option, date);
                myCollection.push(myObj);
            });
            return JSON.stringify(myCollection);
        }
        function SubmitData() {
            var data = GetJsonData();
            $.ajax({
                url: "testForm.aspx/PostData",
                data: "{ 'myCollection': " + data + " }",
                dataType: "json",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                success: function () {
                    alert("Success");
                }
            });
        }
        $(document).ready(function () {
            filldd();
            CreateDP();
            var rowstring = "<tr class='row'><td class='number'></td><td><input type='text' class='title'/></td><td><select class='myDropDownLisTId'/><input type='text' class='datepicker'/></td><td><input type='submit'></input></td></tr>";
            $("#addField").click(function (event) {
                $("#field tbody").append(rowstring);
                filldd();
                CreateDP();
                if ($("td").hasClass("number")) {
                    var i = parseInt($(".num:last").text()) + 1;
                    $('.row').last().attr("id", "row" + i);
                    $($("<span class='num'> " + i + " </span>")).appendTo($(".number")).closest("td").removeClass('number');
                }
                event.preventDefault();
            });
            $("#deleteField").click(function (event) {
                var lengthRow = $("#field tbody tr").length;
                if (lengthRow > 1)
                    $("#field tbody tr:last").remove();
                event.preventDefault();
            });
            $("#btnsave").click(function () {
                SubmitData();
            });
        });
        function filldd() {
            var data = [
                { id: '0', name: 'test 0' },
                { id: '1', name: 'test 1' },
                { id: '2', name: 'test 2' },
                { id: '3', name: 'test 3' },
                { id: '4', name: 'test 4' },
            ];
            for (i = 0; i < data.length; i++) {
                $(".myDropDownLisTId").last().append(
                    $('<option />', {
                        'value': data[i].id,
                        'name': data[i].name,
                        'text': data[i].name
                    })
                 );
            }
        }
        function CreateDP() {
            $(".datepicker").last().datepicker();
        }
        $(document).on('click', 'input[type="submit"]', function () {
            alert($(this).closest('tr')[0].sectionRowIndex);
            alert($(this).closest('tr').find('.myDropDownLisTId').val());
        });
    </script>
</head>
<body>
    <form id="frmMain" runat="server">
    <table id="field">
        <tbody>
            <tr id="row1" class="row">
                <td>
                    <span class='num'>1</span>
                </td>
                <td>
                    <input type="text" class="title"/>
                </td>
                <td>
                    <select class="myDropDownLisTId">
                    </select>
                    <input type="text" class="datepicker" />
                </td>
                <td>
                    <input type="submit"></input>
                </td>
            </tr>
        </tbody>
    </table>
    <button type="button" id="addField">
        Add Field</button>
    <button type="button" id="deleteField">
        Delete Field</button>
    <button type="button" id="btnsave">
        SAVE</button>
    </form>
</body>
</html>

CodeBehind:

public partial class testForm : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    [WebMethod]
    public static void PostData(List<MyClass> myCollection)
    {
        Console.WriteLine(myCollection.Count);
    }
}
public class MyClass
{
    string title;
    public string Title
    {
        get { return title; }
        set { title = value; }
    }
    string option;
    public string Option
    {
        get { return option; }
        set { option = value; }
    }
    string date;
    public string Date
    {
        get { return date; }
        set { date = value; }
    }
}

希望这能帮助

参考文献:
Json2.js文件
字符串方法
在js 中定义一个类