0

我有两个 asp:BulletedLists,一个在 Page_Load 上填充,另一个是空的。用户可以在它们之间拖放<li>,那个拖放的内容是

    function Move(element, source, target) {
        var newLI = document.createElement("li");
        var sourceBL = document.getElementById(source);
        var targetBL = document.getElementById(target);

        newLI.innerHTML = element.innerHTML;
        sourceBL.removeChild(element);
        targetBL.appendChild(newLI);
    }

我创建了一个新元素,以便它在 asp:BulletedList 内对齐,而不是将自己放置在释放鼠标的位置。

问题是我需要知道回发时的位置,第二个 asp:BulletedList 始终为空,第一个 asp:BulletedList 使用原始值填充自身,即使我没有清除或重新填充它们。

    foreach (ListItem li in blSelectedDocuments.Items) // .Items is empty
    {

    }
4

2 回答 2

0

过去在 ASP.NET WebForms 页面上使用 jQuery 插件时,我使用 AJAX 将更新的数据发送回 ASP.NET AJAX 页面方法,然后将更改存储到Session缓存中。然后在回发时,Page_Load将查看Session列表中的值的顺序(我有一个拖放列表用于报告的显示顺序)。

模拟代码示例:

JavaScript:

function Move(element, source, target) {
    var newLI = document.createElement("li");
    var sourceBL = document.getElementById(source);
    var targetBL = document.getElementById(target);

    newLI.innerHTML = element.innerHTML;
    sourceBL.removeChild(element);
    targetBL.appendChild(newLI);

    // TODO: Serialize source and target lists to JSON to pass to the server
    var serializedData = {};

    // Use jQuery.ajax() to call ASP.NET AJAX Page Method
    $.ajax({
        type: "POST",
        url: "PageName.aspx/UpdateListsInSessionCache",
        data: serializedData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            // Do something here when the AJAX calls completes
        }
    });
}

ASP.NET 代码隐藏 (C#)

using System.Web.Services;

[WebMethod]
public static void UpdateListsInSessionCache(List<ListItem> source, List<ListItem> target)
{
    Session["SourceList"] = source;
    Session["TargetList"] = target;
}

protected void Page_Load(object sender, EventArgs e)
{
    // Create new lists so we have something empty and not null to work with
    var source = new List<ListItem>();
    var target = new List<ListItem>();

    // Always check for values in Session cache and update if there are values
    if (Session["SourceList"] != null)
    {
        source = Session["SourceList"] as List<ListItem>;
    }

    if (Session["TargetList"] != null)
    {
        target = Session["TargetList"] as List<ListItem>;
    }

    // Do something with source and target lists
}
于 2013-07-19T15:42:09.920 回答
0

可怕的是,这些都不起作用。我在 SharePoint 上,由于 asp.config 文件位于 SharePoint 的某个深暗角落,因此未启用会话(或其他任何原因)。 ViewState 也没有以类似的方式工作。也许其中的一半 AJAX 会起作用,但我从来没有走到那一步。

我开始工作的解决方案是创建一个隐藏输入字段,将 asp:BulletedList 的顺序写入该隐藏字段,以便通过提交按钮进行回发。感谢 JasonP 的序列化小提琴。

注意:我尝试了一些在网上找到的其他建议,使用带有 ViewState 和/或 Readonly 属性集的标签/文本框对我不起作用。标签可以更改页面内的文本,但在回发时没有保留。

于 2013-07-22T12:59:57.857 回答