【问题标题】:Dynamic labels in ASP.NET / javascriptASP.NET / javascript 中的动态标签
【发布时间】:2015-05-11 20:04:41
【问题描述】:

我正在做的网站需要有动态标签,例如: 如果网页列出了特定书籍的作者(有多个作者),它看起来像这样: Author 1: Nikola Tesla [Remove] Author 2: Elon Musk [Remove] Author 3: Alan Turing [Remove]

(请注意,在这种情况下,[Remove] 是一个按钮,用于删除作为作者的特定人员。)

我的问题是,假设我删除了 Elon Musk 作为作者,图灵的标签现在应该更改以反映这一点(将变为 Author 2)。

我已经使用客户端 JavaScript 尝试了一些不同的事情(因为解决方案需要在不刷新页面或任何回发的情况下工作)但我自己无法接近可行的解决方案,我的逻辑似乎不正确或受限于我缺乏网络开发经验。我根本没有做过太多的网络开发,所以我真的在学习。该解决方案还需要在用户向图书添加新作者的情况下工作。

编辑:作者不存储在表格中,而只是使用标签列出。这(由于我无法控制的事情)无法更改。

编辑 2:这是我认为相关的代码,如果需要其他内容,请告诉我。
<div ID='dvAuthor" + i.ToString + "' class='form-group'><div class='col-sm-4 control-label'>

一个额外的转折是在服务器端,它在添加作者时替换占位符(这意味着当添加作者时,页面确实会刷新 - 这很好,但删除不应该要求相同) .更有趣的是我们没有使用 JQuery!

i.ToString 只是一个添加的整数,以便对作者的 ID 进行编号,例如 dvAuthor0 等等。

编辑 3:回复@Basic

好的,这让事情变得更清楚了。作者标签的div 来自服务器(即,每次添加作者时,页面都会刷新,客户端现在将新添加的作者呈现给他们。)所以我想我的问题是,我将如何循环div 在客户端,或者更好的是,如果我不知道页面上有多少作者,我可以遍历每个作者的div 并获取他们的 ID?会不会是这样的while(hasNextAuthor) {add author ID to array} 抱歉所有问题,我对 Web 开发的东西真的很陌生,我正在尽我所能。

另外,我不需要担心从网页中删除作者,我已经有一个功能可以做到这一点(在客户端和服务器上)。编号是唯一需要做的事情,它实际上只是装饰性的,当前的编号系统工作正常,但不会在用户删除作者时动态更改编号,而是等到用户选择保存然后重新加载页面用正确的编号。

编辑 4:我想我有办法完成这项工作,我只是挂断了一个……如何从客户端获取网页上的作者数量?它们是 JavaScript 中的一种方式,我可以循环查看为网页创建了多少 divs?

【问题讨论】:

  • 贴一些实际代码! :D
  • 如果您发布您的 HTML 和当前的 JavaScript,我将扩展我的答案以完全满足您的需求。目前,如果您应用相同的概念,它会起作用。
  • @VulgarBinary 我已经请求我的上级允许发布已编辑的代码示例,我很可能会在明天早上得到答复(工作日到此结束)。 (程序安全性高)。我将确保在将来发布我的问题时提供示例,对延迟感到抱歉。但感谢您迄今为止提供的帮助。
  • 不用担心,如果您无法发布代码,我在下面发布的概念至少应该让您走上正轨。元素本身的 ID 并不重要,您只需要获取作者的所有 # 并在每次删除时重新编号。我猜测的实际删除链接链接到调用您的.NET 的实际ID(uuid 或其他)。如果这纯粹是装饰性的,那么我已经发布的内容应该会为您指明正确的方向。 :-) 我明天再来看看。
  • 考虑到缺少回发和数据库存储,我有点好奇您按下删除按钮之后会发生什么。例如,一旦您按照自己的意愿对列表进行排序,您的页面会做什么?

标签: javascript asp.net vb.net


【解决方案1】:

有一些库可以通过 JavaScript 进行模板化。淘汰赛是一个不错的选择,您可以在此处了解更多信息: http://knockoutjs.com/documentation/template-binding.html ...并在这里看到一个很好的例子: https://www.devbridge.com/articles/knockout-a-real-world-example/

使用 Knockout,您基本上可以创建一个客户端 ViewModel 和一组可观察的作者。然后可以将它们绑定到模板 HTML UI,该 UI 与 ViewModel 交互,直到需要将其保存回来。

使用该库重新绑定应该没什么问题。

【讨论】:

    【解决方案2】:

    原 JQuery 解决方案

    您可以使用具有奇数索引的数组并绑定到它。这样您就可以解决缺失的索引。

    There is an older stackoverflow article here that answers your question.

    相当于指定每个元素的索引以及输入值:

    <input type="hidden" name="Author.Index" value="3" />
    

    如果你只是想让文字更漂亮,你可以这样做:

    <div id="author_1" class="author-container">Author <span class="authors" data-index="1">1</span>: First Last <a ..>[Remove]</a></div>
    

    然后在 JavaScript 中你可以做 (Assuming JQuery):

    function UpdateIndexes()
    {
       var idx = 1;
       $(".authors").each(function(el){
          $(this).text(idx);
          idx++;
       });
    }
    
    $(function(){
        $(".whateverRemoveSelector").on("click", function(){
          $(this).parents(".author-container").remove();
          UpdateIndexes();
       });
    })
    

    仅 JavaScript 解决方案

    我试图让变量名保持原样,以便于理解。这既可以从作者的数组创建、连接删除事件,也可以重新编号作者的数组。

    希望这能解决您需要做的事情!

    var authors = [
      { Name: "J.K. Rowling" },
      { Name: "Orson Scott Card" },
      { Name: "Stephen King" },
      { Name: "Nicholas Sparks" }
    ];
    
    /*
    <div ID='dvAuthor" + i.ToString + "' class='form-group'><div class='col-sm-4 control-label'>
    */
    
    function Remove(){
      var e = event.target.parentNode.parentNode;  
      e.parentNode.removeChild(e);
      
      var numbers = document.getElementsByClassName("sel-author-number");
      for(var i = 0; i < numbers.length; i++){
        var number = numbers[i];
        number.innerHTML = i+1;
      }
    }
    
    window.onload = function(){
      var authors = [
        { Name: "J.K. Rowling" },
        { Name: "Orson Scott Card" },
        { Name: "Stephen King" },
        { Name: "Nicholas Sparks" }
      ];
      
      var e = document.getElementById("authorsContainer");
      for(var i = 0; i < authors.length; i++){
        var container = document.createElement("div");
        var author = document.createElement("div");
        var authorNumber = document.createElement("span");
        authorNumber.setAttribute("class", "sel-author-number");
        authorNumber.appendChild(document.createTextNode((i+1)));
        container.setAttribute("class", "form-group");
        var authorID = "author" + (i+1);
        container.setAttribute("id", authorID); 
        author.setAttribute("class","col-sm-4 control-label");
        author.appendChild(authorNumber);
        author.appendChild(document.createTextNode(": " + authors[i].Name));
        var removeLink = document.createElement("span");
        removeLink.appendChild(document.createTextNode("[Remove]"));
        author.appendChild(removeLink);
        container.appendChild(author);
        
        e.appendChild(container);
        removeLink.onclick = function(){
          Remove();
        };
      }
    };
    &lt;div id="authorsContainer"&gt;&lt;/div&gt;

    【讨论】:

    • 我添加了一些代码和更多细节。这些更改只是为了使文本看起来更漂亮——而不是在其他任何地方实际使用或引用。如果您认为这种方法仍然有效,或者您需要更多详细信息,请告诉我。感谢您迄今为止的所有帮助。
    • 修改后的答案,希望能解决您正在寻找的问题。祝你好运@errorreplicating!
    • 非常感谢,我仍在努力实施解决方案,但到目前为止我已经学到了很多东西,像你和 @Basic 这样的人让这个社区如此伟大,什么帮助我保持积极的心态,因为我正在处理越来越令人沮丧的事情。再次感谢!
    • @errorreplicating - 友情提醒stackoverflow.com/help/someone-answers
    • 很遗憾,我没有足够的声望在这个帐户上投票,但一旦我这样做了,我一定会回来投票。干杯!
    【解决方案3】:

    你有 2 个不同的问题;

    • 管理作者列表(可能带有 ID)
    • 显示编号列表

    对于第一部分,有一个数组或作者,并使用 js 来添加/删除。如果您不熟悉该技术,请参阅this answer。当对该数组进行任何更改时,调用第二个“更新屏幕”函数,该函数会清除保存作者的&lt;div&gt; 并重新创建其内容。

    您的update() 函数可能如下所示:

    //Add and remove from authors as you wish, then call update()
    var authors = ['Bob', 'Sue'];
    
    function update() {
        var container = document.getElementById('Authors');
    
        //clear the container, open a list
        container.innerHTML = "<ul>"
    
        //Recreate the contents...
        for(var i = 0; i < authors.length; i++) {
            //Add the author
            container.innerHtml += '<li>' + i + '. ' + authors[i] + '</li>';
        }
    
        //Close the list
        container.innerHTML += "</ul>"
    }
    

    当然,如果您使用的是 jQuery,那么这段代码可以被大量清理...

    编辑:作者最初来自哪里并不重要,您可以轻松地将它们放入 javascript 列表中。猜测一下循环代码/对象模型的样子,更改生成 div 的代码

    <% For i = ... %>
        <div ID='dvAuthor" + i.ToString + "' class='form-group'><div class='col-sm-4 control-label'>
    <% Next %>
    

    改为生成数组条目

    var authors = [];
    <% for i = ... %>
        authors[i] = '<%=Authors(i).Name.Replace("'", "\'") %>';
    <% Next %>
    

    或者如果这不可能,您可以从当前页面内容中填充列表(比较混乱,但是...)

    var authors = [];
    var authorDivs = document.getElementById("Container").getElementsByTagName("div");
    for(var i=0;i<authorDivs.length;i++) {
        authors[i] = authorDivs[i].innerHTML;
    }
    

    而且没有多余的东西:

    var authorDivs = document.getElementById("Container").getElementsByTagName("div");
    for(var i=0;i<authorDivs.length;i++) {
        var currentId = authorDivs[i].id;
        var currentContents = authorDivs[i].innerHTML;
        // etc...
    }
    

    【讨论】:

    • 不幸的是,作者来自数据库,所以我认为不可能将它们存储在这样的数组中。我在上面添加了一些更多的细节,希望能把事情弄清楚一点。而且,遗憾的是没有 JQuery。
    • 查看我的编辑 - 数据来自何处无关紧要。如果您愿意,您可以单独通过 dom 操作列表,但它会很快变得混乱。这就是为什么我更喜欢页面上的单一“权威”数组,其他所有内容都从该数组更新。如果您愿意,可以混合使用第一个/最后一个 sn-p 以直接操作 DOM 并跳过 authors 数组
    • 我在上面添加了一个编辑来回复您的评论,我越来越了解正在发生的事情,如果您能提供更多帮助,我将不胜感激。
    • 好的,响应您的编辑,我的最后一个 sn-p 满足您的需求。假设您在页面上有以下结构... &lt;div id="Container"&gt;&lt;div id="dvAuthorXXX"&gt;...&lt;/div&gt;&lt;div id="dvAuthorYYY"&gt;...&lt;/div&gt;&lt;/div&gt;... 最后一个 sn-p 将在 ID 为 Container 的元素内找到所有 &lt;div&gt; 标签并循环遍历它们。 authorDivs.length 是您确定页面上作者数量的方式,authorDivs[i] 代表每个作者 div,因此例如 authorDivs[i].id 将在您循环时返回当前 div 的 id。
    • 非常感谢,我非常感谢,我学到了很多东西。我仍在努力,但我想我现在知道我在做什么(有点)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2011-09-06
    • 2015-05-21
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多