javascript - 保存动态创建的 jQuery 连接可排序列表的顺序

标签 javascript c# jquery asp.net jquery-ui

我想做的是有一个 asp 转发器,它动态生成给定数量的连接的 jQuery 可排序列表组。然后,一旦用户按下 asp 按钮,我想将每个列表组的顺序保存到 MS SQL 数据库中。

列表项初始填充到无序可排序列表工作正常,并且对每个列表进行排序的能力也工作正常。

代码示例如下。我更改了变量/方法名称,省略了我认为对问题而言不必要的代码。

HTML/ASP:

<asp:Repeater ID="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound">
     <ItemTemplate>
         <div class="col-md-6">
              <strong>Column 1</strong>
              <br />
              <ul id="Sortable1" class="sortable" runat="server"></ul>
         </div>
         <div class="col-md-6">
              <strong>Column 2</strong>
              <br />
              <ul id="Sortable2" class="sortable" runat="server"></ul>
         </div>
     </ItemTemplate>
</asp:Repeater>

<div class="row">
    <div class="col-md-3">
        <asp:Button runat="server" ID="SaveButton" Text="Save Layout" OnClick="SaveButton_Click" CssClass="btn btn-primary" />
    </div>
</div>

C# 代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
     if(!IsPostBack)
     {
          List<MyObject> myObjects = GetMyObjectsFromDB();
          MyRepeater.DataSource = myObjects;
          MyRepeater.DataBind();
     }
}

protected void MyRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item)
    {
         HtmlGenericControl ul1 = (HtmlGenericControl)e.Item.FindControl("Sortable1");
         HtmlGenericControl ul2 = (HtmlGenericControl)e.Item.FindControl("Sortable2");

         // script block that'll be added to every group of sortable lists to allow for the connected sorting functionality
         string scriptBlock =
             @"<script type=""text/javascript"">
                  $(function () {
                       $(""#" + ul1.ClientID + @""").sortable({
                            connectWith: ""#" +  ul2.ClientID + @"""
                       }).disableSelection();
                  });

                  $(function () {
                       $(""#" + ul2.ClientID + @""").sortable({
                           connectWith: ""#" + ul1.ClientID + @"""
                       }).disableSelection();
                  });
             </script>";

        Page.ClientScript.RegisterStartupScript(this.GetType(), ul1.ClientID + ul2.ClientID, scriptBlock);

        List<MyOtherObject> myObjectsForEachListGroup = GetMyListObjectsFromDB((int)DataBinder.Eval(e.Item.DataItem, "GroupId"));

        AddListItemsToSortables(ul1, ul2, myObjectsForEachListGroup);
    }

}

private void AddListItemsToSortables(HtmlGenericControl ul1, HtmlGenericControl ul2, List<MyOtherObject> myObjectsForEachListGroup)
{
    for (int i = 0; i < myObjectsForEachListGroup.Count; i++)
    {
         HtmlGenericControl li = new HtmlGenericControl("li");
         li.Attributes.Add("id", myObjectsForEachListGroup[i].Id.ToString());
         li.Attributes.Add("class", "ui-state-default");
         li.Attributes.Add("runat", "server");
         li.InnerText = myObjectsForEachListGroup[i].Name;

         if (i % 2 == 0)
         {
             ul1.Controls.Add(li);
         }
         else
         {
             ul2.Controls.Add(li);
         }
     }
}


private void SaveOrder()
{
    foreach (RepeaterItem rptItem in MyRepeater.Items)
    {
        HtmlGenericControl ul1 = (HtmlGenericControl)rptItem.FindControl("Sortable1");
        HtmlGenericControl ul2 = (HtmlGenericControl)rptItem.FindControl("Sortable2");

        int i = 0;

        foreach (HtmlGenericControl li in ul1.Controls)
        {
            // save the row and column for the given object in the DB
            UpdateMyObjectPosition(Convert.ToInt32(li.ClientID), i, 0);
            i++;
        }

        i = 0;

        foreach (HtmlGenericControl li in ul2.Controls)
        {
            // save the row and column for the given object in the DB
            UpdateMyObjectPosition(Convert.ToInt32(li.ClientID), i, 1);
            i++;
        }
    }
}

我遇到的问题是每个 <li>元素不会在回发期间持续存在。 ul1.Controlsul2.Controls只包含一个 LiteralControl在我的 SaveLayout方法,仅此而已。我尝试删除 !Page.IsPostBack来自 Page_Load方法,它只是在回发期间重新初始化转发器列表,并没有给我更改后的顺序。

我尝试研究几个关于通过将控件的 ID 存储在 View 状态中来持久化动态控件数据的 stackoverflow 问题,但在我的情况下它似乎不起作用。或许我没有做对。

最佳答案

通过使用 javascript 和 asp HiddenField 解决了我的问题,它将获得列表的顺序:

function GetOrder() {
    var order1 = $("#<%= Sortable1.ClientID %>").sortable('toArray').toString();
    var order2 = $("#<%= Sortable2.ClientID %>").sortable('toArray').toString();

    document.getElementById("<%= DynamicFieldData.ClientID %>").value = order1 + " " + order2;
}

按钮:

<asp:Button runat="server" ID="SaveButton" Text="Save Layout" OnClick="SaveButton_Click" OnClientClick="GetOrder()" CssClass="btn btn-primary" />

其中 DynamicFieldData 是 HiddenField,您将在其中存储列表中每个项目的 ID 数组。然后,您可以在代码隐藏中提取 HiddenField 中的值,并按需要使用它。

我还必须修改我的代码隐藏中的 SaveOrder() 方法,以便现在循环遍历 HiddenField 值中的字符串(我拆分的)。

关于javascript - 保存动态创建的 jQuery 连接可排序列表的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35513255/

相关文章:

javascript - 如果使用 javascript 更改任何字段,如何使用 Jquery 跟踪更改?

在错误的位置添加了 Javascript 变量以及 innerHTML 中的字符串

c# - 是否有用于 ASP.NET MVC 的混合身份验证配置 ASP.NET 模块 (MADAM) 的端口?

javascript - 具有多个 key 对的 JSON 的适当数据结构

javascript - 内容脚本中的监听器

javascript - 用户允许访问后如何使用浏览器地理位置

jquery - 需要 Overlay 使用 jQuery 在 Div 上打开

javascript - 如何将网页上的图像尺寸加倍?

javascript - Masonry js 扰乱了 Bootstrap 选项卡功能

c# - 动态排列要在面板内平铺的控件