我想要做的是有一個動態生成給定數量的連接jQuery可排序列表組的asp中繼器。然後,我想要將每個列表組的順序保存到MS SQL數據庫中,一旦用戶按下一個asp按鈕。保存動態創建的jQuery連接排序列表的順序
無序可排序列表的列表項的初始種羣可以正常工作,並且對每個列表進行排序的能力都可以正常工作。
代碼示例如下。我更改了變量/方法名稱,省略了代碼,我覺得這個問題沒有必要。
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.Controls
和ul2.Controls
只在我的SaveLayout
方法中包含LiteralControl
,沒有別的。我嘗試從Page_Load
方法中刪除!Page.IsPostBack
,它只是在回發期間重新初始化中繼器列表,並沒有給我改變的順序。
我試圖通過存儲控件的ID在視圖狀態,但它似乎並沒有在我的情況下工作,看着有關持久性動態控制數據幾個stackoverflow問題。或者,也許我沒有做對。