Почему мой jQuery.post () ajax дает сбой при возврате одного представления, но не завершается при возврате другого - PullRequest
1 голос
/ 23 декабря 2010

Я пытаюсь написать простой постер с комментариями. У меня есть этот код в контроллере:

    [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."); Ajax $.post() не удается. Я не понимаю, почему $.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>
<% } %>

View ("CommentError", "Невозможно оставить комментарий."); (не работает)

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

Что из этого может привести к сбою сообщения ajax?

1 Ответ

3 голосов
/ 23 декабря 2010

Если сработала функция ajaxError, это сильно указывает на то, что действие вашего контроллера возвращает код состояния, отличный от 200, вероятно, 500, что является сильным признаком того, что действие вашего контроллера выдает исключение, прежде чем когда-либо достигнет последней строки, и сможет вернуться к просмотру.

Итак, вот что нужно сделать:

  1. Использование FireBug
  2. Посмотрите, что ваш сервер отправляет в ответ на запрос AJAX
  3. Анализ кода состояния ответа и содержимого ответа

Альтернативный подход:

  1. Поместите точку останова в действие вашего контроллера
  2. Хит F5
  3. Когда действие контроллера выполнено, пошагово пройдитесь по вашему коду
  4. Соблюдайте в точности, что происходит

Примечание: я очень настоятельно рекомендую вам правильно кодировать вход 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
});

Обратите внимание, что каждый раз, когда вы используете знаки +, & и = при работе с параметрами строки запроса (независимо от того, какой язык вы используете), вы делаете это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...