ASP.NET MVC AJAX Проблема - PullRequest
       2

ASP.NET MVC AJAX Проблема

0 голосов
/ 18 ноября 2009

Итак, у меня есть простая функция голосования на моей странице asp.net mvc. Моя страница индекса загружена со всеми сообщениями в базе данных. Пользователь может голосовать «да» или «нет» относительно того, понравилась ли ему эта публикация или нет, по ссылкам внутри каждого сообщения. Поэтому в моей базе данных есть таблица с именем posts, и в этой таблице есть два поля с именами vote_yes и vote_no, которые отслеживают количество голосов.

Мое действие голосования не имеет представления, потому что это метод JSONResult, но мое представление для действия индекса выглядит следующим образом:

 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<INDA.Models.Post>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Welcome
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <% foreach (var item in Model) { %>

        <div class="post">
            <div class="postText">
                <%= Html.Encode(item.message) %>
            </div>
            <div class="postInfo">
                <span class="timestamp left">
                    Posted by <em><%= Html.Encode(item.author)%></em> on 
                    <%= Html.Encode(String.Format("{0:g}", item.date)) %>
                </span> 
                <span class="voting right">
                    Comments<em>
                        <%= Html.ActionLink(
                                "Liked This (" + Html.Encode(item.vote_yes) + ")",
                                "Vote",
                                new { id = item.post_id, vote = "yes" },
                                new { @class = "vote_yes" } )%>
                    </em> - 
                    <em>
                        <%= Html.ActionLink(
                                "Hated It (" + Html.Encode(item.vote_no) + ")",
                                "Vote",
                                new { id = item.post_id, vote = "no" },
                                new { @class = "vote_no" } )%>
                    </em>
                </span>
                <div class="clear"></div>
            </div>  
        </div>

    <% } %>

</asp:Content>

Сейчас я тестирую только голосование "да", поэтому jQuery на моей главной странице выглядит так:

$(document).ready(function() {
                $(".vote_yes").click(function() {
                    var currLink = $(this);
                    var action = currLink.attr("href");
                    $.getJSON(action, null, function(data) {
                        currLink.html("Liked This (" + data.vote_yes + ")");
                    });
                    return false;
                });
            });

А мой PostsController с индексами и действиями для голосования выглядит так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using INDA.Models;

namespace INDA.Controllers
{
    public class PostsController : Controller
    {
        INDARepository INDARepository = new INDARepository();

        // action methods
        [OutputCache(Location = OutputCacheLocation.None)]
        public ActionResult Index()
        {
            var posts = INDARepository.GetAllPosts().ToList();
            return View(posts);
        }

        [OutputCache(Location=OutputCacheLocation.None)]
        public JsonResult Vote(int id, string vote)
        {
            Post p = INDARepository.GetPost(id);
            if (vote == "yes")
            {
                p.vote_yes++;
            }
            else if (vote == "no")
            {
                p.vote_no++;
            }

            INDARepository.Save();

            return Json(p);
        }

    }
}

Теперь вот проблема. Когда я нажимаю ссылку «Liked This (X)», чтобы голосовать «за» в каждом сообщении, он проходит вызов AJAX и обновляет счет в базе данных. Тем не менее, ссылка в первом посте никогда не будет обновляться, чтобы отразить новое количество голосов в базе данных, иначе она должна выглядеть как «Liked This (X + 1)», но остается «Liked This (X)». Странно то, что во всех других постах ссылки обновляются нормально. Это просто первый пост, который никогда не работает. Кто-нибудь может помочь? Я попытался добавить аспект отсутствия кэширования, но безрезультатно.

Спасибо и извините, это так долго, Райан

Ответы [ 3 ]

1 голос
/ 25 ноября 2009

Насколько я могу судить, здесь есть три вещи, которые могут пойти не так.

  1. Установите точку останова на сервере, на который вы возвращаете сообщение, чтобы убедиться, что вы возвращаете обновленное сообщение
  2. Убедитесь, что Json работает правильно - измените строку с именем currLink.html ("Liked This (" + data.vote_yes + ")"); что-то вроде currLink.html ("bob") и сделать предупреждение (data.vote_yes)
  3. Убедитесь, что currLink указывает на правильный элемент DOM, либо используя Firebug, как было предложено, либо снова отправляя простое предупреждение.
0 голосов
/ 18 ноября 2009

Также с Firebug вы можете увидеть, что вернулся с вашего сервера. Это может быть очень полезно

Также попробуйте переписать код как currLink.html («Запрос выполнен успешно») и нажмите «да» для первого сообщения. Если нет ошибки на стороне сервера, сообщение будет изменено.

Но это выглядит как ошибка на стороне сервера, пока запрос для меня, как будто ваш обработчик никогда не вызывается. Также в Firebug попробуйте установить точку останова на линии с currLink.html.

0 голосов
/ 18 ноября 2009

Используйте Firbug и установите точку останова в currLink.html ()

В окне просмотра введите currLink.html ('test') и посмотрите, что произойдет.

Тогда взгляните на data.vote_yes в окне просмотра. Я думаю, вы увидите проблему тогда.

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