C# ASP.NETMVCAJAX问题

C# ASP.NETMVCAJAX问题,c#,jquery,asp.net-mvc,ajax,C#,Jquery,Asp.net Mvc,Ajax,因此,我在asp.NETMVC页面上有一个简单的投票功能。我的索引页加载了数据库中的所有帖子。用户可以通过每个帖子内的链接投票决定是否喜欢该帖子。因此,在我的数据库中有一个名为posts的表,该表中有两个字段,分别名为vote\u yes和vote\u no,用于跟踪投票计数 我的投票操作没有视图,因为它是一个JSONResult方法,但我的索引操作视图如下所示: <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared

因此,我在asp.NETMVC页面上有一个简单的投票功能。我的索引页加载了数据库中的所有帖子。用户可以通过每个帖子内的链接投票决定是否喜欢该帖子。因此,在我的数据库中有一个名为posts的表,该表中有两个字段,分别名为
vote\u yes
vote\u 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>
$(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;
                });
            });
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);
        }

    }
}
我的带有索引和投票操作的PostsController如下所示:

 <%@ 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>
$(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;
                });
            });
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);
        }

    }
}
现在问题来了。当我在每篇文章中单击“likethis(X)”链接投赞成票时,它将通过AJAX调用并更新数据库中的计数。然而,第一篇文章中的链接将永远不会更新以反映数据库中的新票数,也就是说,它应该看起来像“喜欢这个(X+1)”,但仍然是“喜欢这个(X)”。奇怪的是,在所有其他帖子中,链接都更新得很好。这只是第一篇永远不起作用的帖子。有人能帮忙吗?我尝试添加无缓存特性,但没有效果

谢谢,抱歉,时间太长了,
Ryan

使用Firbug并在currLink.html()上设置断点

在监视窗口中输入currLink.html('test')并查看发生了什么


然后查看数据。在watch(观察)窗口中投赞成票。我想你到时候会看到问题。

还有firebug,你可以看到从服务器返回的内容。它可能非常有用

另外,尝试将代码重写为currLink.html(“请求成功”),并单击“是”作为第一篇文章。如果没有服务器端错误,则消息将被更改


但它看起来像服务器端错误,而我的请求,就像你的处理程序从来没有被调用。此外,在Firebug中,请尝试在currLink.html的行上设置断点。

据我所知,这里有三件事情可能出错

  • 在返回文章的服务器上放置断点,以确保返回的是更新的文章
  • 确保Json工作正常-更改currLink.html(“喜欢这个(“+data.vote_yes+”));点击currLink.html(“bob”)并发出警报(data.vote_yes)
  • 按照建议使用Firebug或再次执行简单警报,确保currLink指向正确的DOM元素

  • 您的回调似乎丢失了一些内容,如果服务器出现错误,请尝试@Trickster和@Fritsch所说的,使用firebug并查找服务器的响应,也许这可以帮助您跟踪错误。谢谢大家的评论。看起来服务器代码正在发回更新后的帖子,我正在更新正确的链接,但JSON似乎有问题。现在还在调查,好的,我现在已经开始工作了。我只是让另一个变量处理新的投票数,并通过控制器中return语句中声明的新对象发送。我认为问题在于试图在回调中访问p的属性。NET可能会在提供页面时将名称更改为无法识别的名称。