代码之家  ›  专栏  ›  技术社区  ›  sarsnake

从弹出窗口更新TreeView节点,同时尽量减少服务器-客户端的行程

  •  2
  • sarsnake  · 技术社区  · 15 年前

    我发了好几次邮件,但是没有人会给我一个我能用通俗英语理解的答案。我对JSON/JQuery/Ajax/其他所有你可能建议我使用的很酷的lib或工具都不熟悉,所以请记住这一点。

    我将c与asp.net web表单一起使用(我也有ajax工具包,但还没有使用)。

    以下是我的设想:

    • 我需要实现一个使用TreeView控件的功能。

    • 父页面将显示一个TreeView,用户将能够单击该节点,这将触发一个弹出窗口,用户将在其中输入一些信息。

    • 弹出窗口将信息保存到数据库中,并将结果值返回到父窗口,父窗口应更新以反映更改。

    据我所知,这是很常见的情况。

    现在,我的问题是,在记住必须最小化客户端和web服务器之间的旅行次数的情况下,实现这一点的最简单方法是什么?

    3 回复  |  直到 10 年前
        1
  •  1
  •   Shaun Humphries    15 年前

    我建议使用 jQuery jqModal 插件而不是使用弹出窗口。

    不管你在JavaScript中寻找的是什么,

    opener.document.[parent_form_ID].[parent_input_ID].value = [value to be passed to the parent];
    

    您可以将上述代码添加到子窗口的save事件中,以将用户输入的数据传回父窗口。

        2
  •  0
  •   Mitchel Sellers    15 年前

    就个人而言,您可能只想在将值返回到父页时触发异步回发以更新树视图。

    实际上,将树视图放在UpdatePanel中,然后有一个隐藏的按钮来触发,并从JS调用它来强制更新。它将使有效载荷保持在较低的水平,并且很可能是您需要更新的最小值。

        3
  •  0
  •   Ronald Wildenberg    15 年前

    我已经举了一个例子来说明你的想法,我希望。它使用 SimpleModal (弹出窗口本身仍然需要一些工作)。当弹出窗口打开时,将显示一个文本框和一个提交按钮。提交时,通过Ajax调用ASP.NET页面方法。page方法接收已发布的数据并返回一个随机数(以显示其工作正常)。然后在树中显示随机数。

    首先 aspx.cs 文件(不带导入)和用作页方法返回类型的类:

    public partial class _Default : Page
    {
        [WebMethod]
        public static MethodResult SaveData(string nodeId, string value,
                                            string elementId)
        {
            return new MethodResult
                   { ElementId = elementId, Result = new Random().Next(42) };
        }
    }
    public class MethodResult
    {
        public string ElementId { get; set; }
        public int Result { get; set; }
    }
    

    页面方法非常简单。它接收节点id,以便您知道要在数据库中更新什么、来自文本框的值以及返回后要更新的UI元素的id。方法返回 MethodResult 类,该类包含要更新的UI元素的id和实际结果(随机数)。

    接下来是 aspx 包含更多代码行的文件。它有很多评论,所以我希望一切都清楚。

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SO_736356._Default" %>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <title>Test</title>
    <script type="text/javascript" src="Scripts/jquery-1.3.2.js" ></script>
    <script type="text/javascript" src="Scripts/jquery.simplemodal-1.2.3.js" ></script>
    <script type="text/javascript">
        $(document).ready(function() {
            // Select all a elements with an id that starts with 'treet' (all
            // nodes in the tree have an id that starts with treet: treet0,
            // treet1, ...). Add an onclick handler to all these elements.
            $("a[id^='treet']").click(function() {
                // In an asp:TreeView the href element of each node contains
                // the node value so we parse the href element to obtain this
                // value.
                var href = $(this).attr("href");
                $("#hiddenNodeId").val(href.substring(href.lastIndexOf("\\\\") + 2, href.indexOf("')")));
                // We need to remember the id of the element we clicked on,
                // otherwise we don't what element to update when the page
                // method call returns.
                $("#hiddenElementId").val($(this).attr("id"));
                // Show the popup.
                $("#popup").modal();
                // Return false to cancel the onclick handler that was already
                // on the a element (view source).
                return false;
            });
    
            // The spanSubmit element is our postback link so when we click it
            // we perform an AJAX call to the page method (Default.aspx/SaveData).
            $("#spanSubmit").css("cursor", "hand").click(function() {
                var nodeId = $("#hiddenNodeId").val();
                var input = $("#txtInput").val();
                var elementId = $("#hiddenElementId").val();
                $.ajax({
                    type: "POST",
                    url: "Default.aspx/SaveData",
                    // The parameter names must match exactly.
                    data: "{nodeId: \"" + nodeId + "\", value: \"" +
                            input + "\", elementId: \"" + elementId + "\"}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(result) {
                        // The property result.d contains our result. We select
                        // the right element and set its text to another value.
                        $("#" + result.d.ElementId).text(
                            "Random number " + result.d.Result);
                    }
                });
            });
        });
    </script>
    </head>
    <body>
    <form id="form" runat="server">
    <div>
        <%-- The actual tree, no fancy stuff here. --%>
        <asp:TreeView ID="tree" runat="server">
            <Nodes>
                <asp:TreeNode Value="0" Text="Node_0" >
                    <asp:TreeNode Value="0_0" Text="Node_0_0">
                        <asp:TreeNode Value="0_0_0" Text="Node_0_0_0" />
                        <asp:TreeNode Value="0_0_1" Text="Node_0_0_1" />
                    </asp:TreeNode>
                    <asp:TreeNode Value="0_1" Text="Node_0_1">
                        <asp:TreeNode Value="0_1_0" Text="Node_0_1_0" />
                    </asp:TreeNode>
                    <asp:TreeNode Value="0_2" Text="Node_0_2">
                        <asp:TreeNode Value="0_2_0" Text="Node_0_2_0" />
                    </asp:TreeNode>
                </asp:TreeNode>
                <asp:TreeNode Value="1" Text="Node_1">
                    <asp:TreeNode Value="1_0" Text="Node_1_0">
                        <asp:TreeNode Value="1_0_0" Text="Node_1_0_0" />
                        <asp:TreeNode Value="1_0_1" Text="Node_1_0_1" />
                    </asp:TreeNode>
                </asp:TreeNode>
            </Nodes>
        </asp:TreeView>
    </div>
    
    <%-- The popup with the hidden fields that are set when we click a node
         and the textbox and submit button. --%>
    <div id="popup" style="display: none;">
        <input id="hiddenNodeId" type="hidden" />
        <input id="hiddenElementId" type="hidden" />
        <label id="lblInput" for="txtInput">Input:</label><input id="txtInput" type="text" />
        <br />
        <span id="spanSubmit">Save</span>
    </div>
    </form>
    </body>
    </html>