使用Javascript

时间:2017-12-26 22:32:58

标签: javascript c# asp.net asp.net-mvc razor

我在博客应用程序中开发了一个评论编辑系统。

当用户点击选定博客帖子的页面时,@ foreach循环会遍历该帖子的评论,并在帖子的主要内容下方的视图中显示每个评论。

用户也可以编辑评论的内容。用户点击评论上的修改按钮,JavaScript功能会将其<textarea>设为可编辑,并取消隐藏&#34;保存&#34;按钮。编辑完成后,用户点击保存,第二个JavaScript函数将更新的内容发送到Controller方法,该方法更新数据库上的相关注释。

当博客文章中有一条评论时,我生成的代码工作正常,但是,当页面上有多条评论时,JavaScript无法区分引用的评论 - 例如,按一个注释上的编辑按钮使所有注释都显示保存按钮。

我是否可以通过简单的方式为每条评论封装JavaScript?

或者是为每个评论生成唯一ID的最佳方法?如果是这样,最好的方法是什么?

我的代码供您参考,但请注意我仍然是网页脚本的新手,所有指针都表示赞赏。

THE VIEW(RAZOR):

@model List<Assignment_3.Models.CommentSubmission

//Blog Post

//Comments
@foreach (var item in Model)
{
    //Comment information

    //The textarea 
    <textarea rows="10" readonly class="descriptionForm" id="DescriptionText">@item.Body</textarea>

    //The Edit button
    <div style="text-align:right">
            <img class="edit_icon" src=@Url.Content("~/Images/edit.png") alt='edit' height=15 width=15 />
         <br />

    //The Save button once editing is complete
         <button type="submit"class="btn1" style="visibility: hidden">
            <p class="split-btn-name">Save</p>
            <span class="separator"></span>
            <p><span class="glyphicon glyphicon-ok"></span></p>
         </button>
    </div>
}

<script>

 //Make textarea editable and unhide the edit save button
 $(document).ready(function () {
    $(".edit_icon ").click(function () {
        $(".descriptionForm").removeAttr("readonly");
        $(".btn").removeAttr("style");
    });
});

 //Send updated content to Controller and update database
 $(".btn1").click(function () {
    $(".btn1").hide();
    $(".descriptionForm").setAttribute('readonly');
    var text1 = document.getElementById('DescriptionText').value; 
    var url = "/Comments/EditComment?id=@item.Id&s="+ text1;
        $.post(url, null, function (data) {
    });
}); 

</script>

控制器:

    public void EditComment(int id, string s)
    {
        var cS = _context.CommentSubmissions
         .Where(c => c.Id == id).
         FirstOrDefault();

        //The Comment's text body
        cS.Body = s;

        _context.Entry(cS).State = EntityState.Modified;
        _context.SaveChanges();

    }

更新

答案(感谢格雷格):

表格:

                <div class="row" style="padding: 15px;">
                    <div data-rel="@item.Id">

                        <textarea rows="10" readonly class="textarea">@item.Body</textarea>
                        <div style="text-align:right">

                           <p>
                                Edit <img class="edit_icon" src=@Url.Content("~/Images/edit.png") alt='Edit' height=15 width=15 id="EditIcon" />
                            </p>

                            @*The Save button once editing is complete*@
                            <input type="button" data-input="edit" value="Save" style="visibility: hidden" id="saveButton">

                        </div>
                    </div>
                </div>

JQUERY:

<script>
$(function () {

    $(".edit_icon").click(function () {
        var container = $(this).closest('.row');
        var id = parent.find('div[data-rel]');
        var content = container.find('.textarea');
        var button = container.find('#saveButton');
        button.removeAttr("style");
        content.focus();
        content.removeAttr('readonly');

    });

    $("#saveButton").click(function () {
        var container = $(this).closest('.row');
        var id = container.find('div[data-rel]');
        var content = container.find('.textarea');
        var button = container.find('#saveButton');

        button.hide();
        content.prop('readonly', true);
        var text1 = descriptionForm.value;

        var url = "/Comments/EditComment?id=" + id + "&s=" + text1;
        $.post(url, null, function (data) {
    });
 });
});
</script>

1 个答案:

答案 0 :(得分:1)

如评论所示,您的JavaScript没有任何独特的锚定。因此,它会修改符合您条件的所有元素,以解决此问题,您可以使用唯一标识符或更好地构建标记来实现。

在您的情况下,您有一个type="submit"的按钮会立即导致回复。不确定这是否确实是你的意图,但你可以这样做:

@foreach(var content in Model)
{
     <form name="content.Id" action="Blog/Save" method="post">

     </form>
}

在这种情况下,您提交的帖子可以直接命中服务器。但是,回帖并不酷。要通过Ajax纠正,你可以做到。

@foreach(var content in Model)
{
     <div class="container">
          <div data-rel="@content.Id">
              <!-- Put form data, or whatever here. -->
               <input type="button" data-input="edit">Edit</input>
          </div>
     </div>
}

现在您拥有一个独特的价值,清晰的结构,您可以非常轻松地在整个层次结构中移动。因此,对于JavaScript,您可以这样做:

function editBlog(element) {
     var container = document.querySelector(element).closest('[data-rel]');
}

我认为这是JavaScript的理想方法,我是jQuery的自定义或像Vue这样的框架。所以仔细检查语法。但理论上,JavaScript将从按钮事件扩展到父节点,然后检索子ID。可能会出现类似的映射或模板,因此您可以将数据发布到您的操作中。

希望这有帮助。

更新:您可能会收到一些域错误,但我希望不会。无论如何,这是一个非常简单的例子。

  • 容器:充当包装器的简单元素。
  • 行:允许您为元素结构创建一行。
  • 专栏:周围的空间,以适应窗户。

重点是,jQuery将从按钮,列,行,行ID到容器递归。但是,它不会影响页面上的任何其他元素。如果更改了jQuery,则不会影响特定元素,例如:

$('button').click(function (e) {
     $(this).text('Edit');  // Only this element
     $('button').text('Edit'); // All button elements
});

&#13;
&#13;
$(function () {
     $('button').click(function () {          
          var container = $(this).parents('.container');
  				var id = parent.find('div[data-rel]');
          var rows = parent.find('.row');
          var columns = parent.find('.column');

          alert('The section id: ' + id.val());

          console.log(container.html());
          console.log(id);
          console.table(rows);
          console.table(columns);
     });
});
&#13;
.container {
  width: 100%;
  
  padding: 1rem;
  box-shadow: 2px -1px 1px -2px, -1px 2px 1px -2px;
}

.row {
  display: flex;
  flex-flow: row;
  justify-content: space-around;
  align-items: center;
}

.column {
  width: 33.3%;
}

.column:last-of-type {
  width: 10%;
}

.column span {
  width: 100%;
  padding: .2rem;
  display: inline-block;
}

.column label {
  width: 95%;
}

.column button {
  width: 100px;
}

.column input, .column textarea {
  width: 95%;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
     <div data-rel="1">
          <div class="row">
               <div class="column">
                    <span>
                         <label>Article Name:</label>
                         <input type="text" data-rel="txtArticleName" />
                    </span>
                    
                    <span>
                         <label>Article Date:</label>
                         <input type="text" data-input="txtArticleDate" />               
                    </span>
               </div>
               
               <div class="column">
                    <label>Article Summary:</label>
                    <textarea data-input="txtArticleSummary" rows="5"></textarea>
               </div>
               
               <div class="column">
                    <button name type="button" onclick="return false;">Save</button>
               </div>
          </div>
     </div>
</div>

<div class="container">
     <div data-rel="2">
          <div class="row">
               <div class="column">
                    <span>
                         <label>Article Name:</label>
                         <input type="text" data-rel="txtArticleName" />
                    </span>
                    
                    <span>
                         <label>Article Date:</label>
                         <input type="text" data-input="txtArticleDate" />               
                    </span>
               </div>
               
               <div class="column">
                    <label>Article Summary:</label>
                    <textarea data-input="txtArticleSummary" rows="5"></textarea>
               </div>
               
               <div class="column">
                    <button type="button" onclick="return false;">Save</button>
               </div>
          </div>
     </div>
</div>
&#13;
&#13;
&#13;

代码有效,但您可能启用了安全性,但可能无法使用它。但这个例子是重要的部分。