javascript - 如何使用一种形式获取动态文本

标签 javascript jquery html ajax asp.net-mvc

我有一个评论回复系统,当我尝试回复评论时,第一个回复正常。

对于任何后续回复,我可以获得要提交的评论 ID 和文章 ID,但我无法获取回复文本值。

我如何根据下面的 Razor 代码每次都对所有回复进行这项工作?

<h4>Comments</h4>
<hr />
@foreach (var item in Model.Comments.ToList())
{
    <!-- Single Comment -->
    <div class="media mb-4">
        <img style="height:40px; width:40px;" class="d-flex mr-3 rounded-circle" src="@item.User.Photo" alt="@item.User.FullName">
        <div class="media-body" style="width:400px;">
            <h5 class="mt-0">@item.User.UserName</h5>
            <div>
                <p style="word-break:break-all">
                    @item.Paragraph
                    @if (Convert.ToInt32(Session["UserId"]) == item.UserId)
                {
                        <a class="btn btn-danger" href="/Home/DeleteComment/@item.CommentId">
                            Delete
                        </a>

                        <div style="height:10px;"> <a id="post_id_1" name='comment1' class="showReply" href="javascript: void(0)">Reply</a></div>
                    }
                </p>
                <p style="font-size:small"><b>Yorum Tarihi:</b>@String.Format("{0: d MMMM yyyy}", item.Date)</p>
            </div>
            <!--Reply Form-->
            <div id="replymsgbox" style="display: none;">
                <form id="frmComment" novalidate="novalidate" method="POST" name="frmComment">
                    <div>
                        <textarea id="replytext" class="" name="comment1[text]"></textarea>
                        <div id="error_text"> </div>
                    </div>
                    <div>
                        <input id="@item.CommentId" class="reply" type="submit" value="Cevapla" name="Submit">
                    </div>
                </form>
            </div>


            @foreach (var reply in Model.ReplyComments.Where(x => x.CommentId == item.CommentId).ToList())
            {
                <div class="media mt-4">
                    <img style="height:40px; width:40px;" class="d-flex mr-3 rounded-circle" src="@item.User.Photo" alt="@item.User.FullName">
                    <div class="media-body">
                        <h5 class="mt-0">@reply.User.UserName</h5>
                        <p>@reply.Paragraph</p>
                        @if (Convert.ToInt32(Session["UserId"]) == item.UserId)
                        {
                            <a class="btn btn-danger" href="/Home/DeleteReply/@reply.ReplyCommentId">
                                Sil
                            </a>
                        }
                    </div>
                </div>
            }
        </div>
    </div>

这是我的javascript代码

<script type="text/javascript">

$(document).ready(function () {

    $('a.showReply').on("click", function (e) {
        $(this).parent("div").parent("div").next("div").slideToggle();
    });

    $(".reply").click(function (e) {

        e.preventDefault();
        var r_comment = $("#replytext").val();
        var r_commentid = parseInt($(this).attr("id"));
        $.ajax({
             url: '/Home/ReplyComment/',
             data: { replycomment: r_comment, articleid:@Model.ArticleId, commentid: r_commentid },
            type: 'POST',
            dataType: 'json',
            success: function (data) {
                alert("Cevap gönderildi");
                window.location.reload();

            }
        });

});
})

最佳答案

您生成了多个元素,其 ID 为 replytext。在您的点击代码中,以及几乎所有其他地方,您都使用类引用作为选择器,这很好。对于回复文本,尽管您有:

var r_comment = $("#replytext").val();

当 ID 重复时,您正试图通过 ID 引用元素。您将需要为您的元素提供唯一的 ID,或者找到一种不同的方式,就像您尝试使用多个 .parent() 选择器或某些搜索那样手动遍历 DOM。

在点击事件中,this 的上下文应该是按钮本身。这意味着使用 this,您可以向上遍历一两个父对象并向下遍历子对象以找到已填充的文本区域。你也可以试试

var r_comment = this.closest("form > textarea").val(); 

理论上应该遍历到上面堆栈中最近的表单,然后再次向下遍历到您的文本区域元素。尝试将调试器添加到您的 onclick 中,并尝试使用 DOM 来查看您的位置和需要的位置,但如果不是您需要的,该代码片段应该可以让您到达那里。

顺便说一句,如果将来你打算将生成的 Razor 标记与 JS 混合使用,通常最好使用 for 循环为索引分配唯一 ID,这样无论你身在何处,都可以基于您当前拥有的控件 ID 的直接 ID 元素查找。

关于javascript - 如何使用一种形式获取动态文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49657892/

相关文章:

javascript - 在 ZingChart 上绘制形状作为值

javascript - Google map api - 标记标签

javascript - 检查关键字的 URL 片段

html - 使图像相对于其父容器具有静态位置?

javascript - 为什么我的 YouTube 链接不能在 Chrome 的 iframe 中自动播放?

javascript - setTimeout 到另一个里面的 JS 函数

javascript - 如何在注销时注销 FCM 设备 token 和服务 worker 以及如何重新初始化 Firebase 应用程序?

javascript - 将解析后的 JSON 保存为 obj

ajax - 使用 $.ajax 和 jsonp 调用 C# Web 服务

javascript - 使用 Javascript 检查给定 HTML 元素中是否存在子元素