Javascript 为什么我的jQuery.post()ajax在返回一个视图时失败,而在返回另一个视图时没有失败?

Javascript 为什么我的jQuery.post()ajax在返回一个视图时失败,而在返回另一个视图时没有失败?,javascript,asp.net-mvc,ajax,jquery,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.IsNo

我想写一张直截了当的评论海报。我在控制器中有以下代码:

    [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.");
    }
这会导致ajax失败吗

以下是两种视图的外观:

查看(“显示评论”,评论);(工程)

评论

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


这会导致ajax post失败吗?

如果触发了
ajaxError
功能,这强烈表明控制器操作返回的状态代码不同于200,可能是500,这强烈表明控制器操作在到达最后一行并能够返回视图之前抛出异常

因此,以下是要执行的步骤:

  • 使用
  • 查看服务器对AJAX请求的响应
  • 分析响应状态代码和响应内容
  • 备选办法:

  • 在控制器操作中设置断点
  • 按F5键
  • 当点击控制器操作时,请逐步执行代码
  • 仔细观察发生了什么
  • 备注:我强烈建议您正确编码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
    });
    

    请注意,每次处理querystring参数时(无论使用何种语言),使用
    +
    &
    =
    符号时,您都犯了错误。

    是否尝试查看响应?您可以尝试Firebug查看响应。您能否更精确一点,您所说的失败是什么意思?FireBug对AJAX请求说了什么?服务器响应什么?请求、响应、状态代码。。。?当AJAX调用失败时,在这里发布您的问题之前,使用FireBug应该是您的第一反应。您所说的响应是什么意思?两个视图都返回html。post成功后,$.post()的success函数将正确执行。返回CommentError视图时,会触发.ajaxError()事件。这可能有助于创建ajax评论海报:我有firebug。。。我如何看待服务器的响应?我只使用它浏览DOMI,我已经在我的操作中设置了断点。我也用F5跑过。没有异常或服务器错误。它正在到达返回视图等…我以前没有使用过
    $.param()
    。我试试看。但是,
    $.param()
    是否只是返回一个字符串?如果我知道如何创建字符串,为什么不创建它?@quakkels,就$.param而言,这将对查询字符串参数进行URL编码。假设用户在文本区域中输入以下注释:
    I will crap&LastId=your site
    。你看:他使用了
    &
    =
    :如果你不对它们进行编码,它将完全扰乱你的控制器动作和你在那里接收到的东西。当您使用字符串连接来构建查询字符串时,将使用以下url:
    ?EntryId=123&Comment=I will-crap&LastId=your site&LastId=456
    。看到问题了吗?@quakkels,现在你知道这是一个500错误,看看响应选项卡。您将看到服务器发送的确切HTML响应。可能是YSOD(死亡的黄屏)
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
    <div class="error">
    <%:Model%>
    </div>
    
    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
    });