当我返回一个View时,为什么我的jQuery.post()ajax失败但是当我返回另一个时它没有失败?

时间:2010-12-23 19:15:48

标签: javascript asp.net-mvc ajax jquery

我正在写一篇简单的评论海报。我在控制器中有这个代码:

    [HttpPost]
    [ValidateInput(false)]
    public ViewResult Comments(MemberData md, long EntryId, string Comment, long LastId = 0)
    {
        bool isModerated = true;
        bool isLoggedIn = GenesisRepository.IsNotGuest(md.MemberGUID);
        bool isCommentAllowed = GenesisRepository.IsPermissionAssigned(md.MemberGUID, "Comments", "Create");

        // Moderate comment?
        if (moderateGuestComments == false && isLoggedIn == false) isModerated = false;
        if (moderateMemberComments == false && isLoggedIn) isModerated = false;

        long memberId = (from m in GenesisRepository.Member
                         where m.MemberGUID == md.MemberGUID
                         select m.MemberID)
                         .FirstOrDefault();

        if (
            EntryId > 0 
            && !string.IsNullOrEmpty(Comment) 
            && memberId > 0
            && isCommentAllowed)
        {
            Comments comment = new Comments { 
                Comment = Comment,
                Date = DateTime.Now,
                isActive = isModerated ? false : true,
                MemberID = memberId,
                StreamEntryID = EntryId,
            };
            if (GenesisRepository.SaveComment(comment))
            {
                List<Comments> comments = new List<Comments>();
                comments = (from c in GenesisRepository.Comments
                            where c.StreamEntryID == EntryId
                            && c.comID > LastId
                            select c
                            ).ToList();

                return View("DisplayComments", comments);
            }
        }

        return View("CommentError", "Unable to post comment.");
    }

当一切正常并且操作返回return View("DisplayComments", comments);时,将触发$.post()成功功能。但是,当操作返回return View("CommentError", "Unable to post comment.");$.post() ajax失败。我不明白为什么$.post()关心我正在回归哪个观点。

这是我的Javascript:

<script type="text/javascript">
    $(document).ready(function () {

        $("#comments").ajaxError(function (event, request, settings) {
            alert("Error requesting page " + settings.url);
        });

        $("button#submitComment").click(function () {

            var commentList = $("#comments");

            var lastId = $(".comment h4").last().attr("id");
            var commentData = "EntryId=" + $("input#EntryID").val()
                                + "&Comment=" + $("textarea#Comment").val()
                                + "&LastId=" + lastId;

            $.post(
                "/find/Comments/Comments",
                commentData,
                function (data) {
                    alert("success");
                    alert(data);
                    if ($(data).filter(".error").length > 0) {
                        error = $(data);
                        $(this).after(error);
                    }
                    else {
                        newComments = $(data);
                        newComments.filter(".comment").css('display', 'none');
                        alert(newComments);
                        commentList.append(newComments);

                        $(".comment").each(function () {
                            $(this).slideDown("fast")
                        });

                        $("#Comment").attr("value", "");
                    }
                }
            );

        });
    });

</script>

这会导致ajax失败?

这是两个视图的样子:

查看(“DisplayComments”,评论); (作品)

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<Genesis.Domain.Entities.Comments>>" %>

<% foreach (var item in Model) %>
<% { %>
    <div class="comment" style="background:#eee; border:1px solid gray; padding:10px 10px 0 10px; margin-bottom:20px;">
        <h4 id="<%:item.comID %>"><%: item.Member.ScreenName%> commented on <%: String.Format("{0:f}", item.Date)%></h4>
        <p>
        <%: item.Comment%>
        </p>
    </div>
<% } %>

查看(“CommentError”,“无法发表评论。”); (不起作用)

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<div class="error">
<%:Model%>
</div>

这会导致ajax帖子失败?

1 个答案:

答案 0 :(得分:3)

如果ajaxError函数被触发,则强烈表示您的控制器操作返回的状态代码不是200,可能是500,这表明您的控制器操作在到达最后一行之前抛出异常并且是能够返回一个视图。

以下是要做的步骤:

  1. 使用FireBug
  2. 查看服务器发送的内容作为对AJAX请求的响应
  3. 分析响应状态代码和响应内容
  4. 替代方法:

    1. 在控制器操作中添加断点
    2. 点击 F5
    3. 执行控制器操作时,单步执行代码
    4. 确切地观察会发生什么
    5. 备注:我强烈建议您正确编码AJAX输入。所以而不是:

      var commentData = "EntryId=" + $("input#EntryID").val()
                                  + "&Comment=" + $("textarea#Comment").val()
                                  + "&LastId=" + lastId;
      
      你肯定应该:

      var commentData = $.param({
          EntryId: $("input#EntryID").val(),
          Comment: $("textarea#Comment").val(),
          LastId: lastId
      });
      

      请注意,每次在处理查询字符串参数时都使用+&=符号(无论您使用的语言是什么),您都做错了。