使用Ajax将消息的状态从未读更新为已读-MVC

时间:2018-07-31 10:04:21

标签: javascript c# json ajax asp.net-mvc

我正在尝试从未读到已读的每条消息的更新状态,并且当我单击列表更新状态中的第一条消息的按钮将起作用时,但是当我单击列表更新中的第二条消息或第三条消息的按钮时状态无法正常工作。谁能帮我或指出正确的方向!

在此先感谢:)

查看:

 <div class="content">
    @{ int i = 0;}
    foreach (var item in Model.Comment_Lists.GroupBy(l => l.MSG).Select(g => .First()))    {
            if (item.se == "Kunde")
            {
              <div  class="bs-callout bs-callout-success">
              <div class="col-xs-3 text-right">
              <button data-toggle="collapse"  data-target="#ShowMSG_@i" id="btnChangestu" class="btn btn-sm btn-success btn-icon"></button></div>
              <span class="text-muted"><small> @item.Date.ToString("dd/MMMM/yyy")</small></span><br />
              <span class="text-muted"><small> @item.MSGType</small></span>
              <input type="hidden" name="IDMSG" id="IDMSG" value="@item.id" />
              <input type="hidden" name="ChangeStu" id="ChangeStu" value="Read Message" />
              <div class="collapse" id="ShowMSG_@i">
                  <p><span>@item.MSG </span></p>
              </div>
              </div>
              }
                i++;
           }
         </div>

JavaScript:

<script>

    $(document).ready(function () {    
        $("#btnChangestu").click(function (e) {
            e.preventDefault();    
            $.ajax({
                type: "POST",
                url: "/Account/UpdateMSGStatus",
                data: {
                    IDMSG: $("#IDMSG").val(),
                    ChangeStu: $("#ChangeStu").val()
                },
                dataType: 'json',
                success: function (result) {    
                    if (!$.trim(result)) {
                        alert("What follows is blank: ");
                    }
                    else {                            
                        result.ID = IDMSG;
                        result.MSGType = ChangeStu;    
                        console.log("Send");    
                    }    
                },
                error: function () {
                    console.log('something went wrong - debug it!');
                }
            })    
        });
    });
</script>

控制器:

public JsonResult UpdateMSGStatus(int? IDMSG , string ChangeStu)
{
    var u = db.Besked.Where(a => a.ID == IDMSG).FirstOrDefault();
    if (u != null)
    {
        u.MSGType = ChangeStu;
        u.ID = IDMSG;
        db.SaveChanges();
    }
    return Json(u, JsonRequestBehavior.AllowGet);
}

1 个答案:

答案 0 :(得分:1)

重复的id属性是无效的html,并且您的jQuery选择器(IDMSG: $("#IDMSG").val()等)将只选择具有该id的第一个元素。

在这种情况下,没有理由使用隐藏的输入。取而代之的是,将值作为data属性进行广告,然后在.click()事件中读取,然后为按钮使用class名称而不是id

请注意,由于您已经对该值进行了硬编码,因此我只包含了IDMSG,而没有包含ChangeStu

<button data-id="@item.id" class="btn btn-sm btn-success btn-icon edit" data-toggle="collapse" data-target="#ShowMSG_@i></button>

然后脚本变为

$('.edit.).click(function (e) {
    e.preventDefault(); 

    // read the value
    var id = $(this).data('id');

        $.ajax({
            type: "POST",
            url: '@Url.Action("UpdateMSGStatus", "Account"), // don't hard code urls
            data: {
                IDMSG: id,
                ChangeStu: 'Read Message' 
            },
            dataType: 'json',
            success: function (result) {