Итак, у меня есть простая функция голосования на моей странице 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)». Странно то, что во всех других постах ссылки обновляются нормально. Это просто первый пост, который никогда не работает. Кто-нибудь может помочь? Я попытался добавить аспект отсутствия кэширования, но безрезультатно.
Спасибо и извините, это так долго,
Райан