C# MVC中绑定控制器方法的问题

C# MVC中绑定控制器方法的问题,c#,asp.net-mvc,C#,Asp.net Mvc,我正在实现一个有两个导航超链接的页面:Previous和next 第一个问题,每次单击超链接,它都会第一次调用该操作。第二次之后,它停止调用控制器上的action方法。我知道浏览器会缓存链接。所以我使用了代码OutputCache…,但它仍然不起作用 第二个问题是,只需单击超链接,操作方法就会被调用两次 有人能告诉我我错过了什么吗?对于经常在Asp.net中工作的人来说,这似乎很简单。我已经记下了我正在使用的代码。请帮忙 控制器代码: [OutputCache(NoStore = true,

我正在实现一个有两个导航超链接的页面:Previous和next

第一个问题,每次单击超链接,它都会第一次调用该操作。第二次之后,它停止调用控制器上的action方法。我知道浏览器会缓存链接。所以我使用了代码
OutputCache…
,但它仍然不起作用

第二个问题是,只需单击超链接,操作方法就会被调用两次

有人能告诉我我错过了什么吗?对于经常在Asp.net中工作的人来说,这似乎很简单。我已经记下了我正在使用的代码。请帮忙

控制器代码:

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*", Location = OutputCacheLocation.None)]
    public string PreviousPage(int currentPage, int blogId){
      List<Blog> blogs = db.Blogs.ToList();
            List<Profile> profiles = db.Profiles.ToList();
            var blog = blogs.FirstOrDefault(b => b.Id == blogId);
            var detailsCount = blog.BlogDetails.Count();
            if (currentPage == 0)
            {
                ViewBag.currentPage = Session["currentPage"]= currentPage;
            }
            else
            {
                ViewBag.currentPage =Session["currentPage"]= currentPage - 1;
            }
            ViewBag.blogId = Session["blogId"] = blogId;
            ViewBag.blogTitle = Session["blogTitle"] = blog.Title;
            if (blog.BlogDetails.Any())
            {
                return blog.BlogDetails[ViewBag.currentPage].BlogPage;
            }
            else {
                return " ";
            }
     }




 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*", Location = OutputCacheLocation.None)]
 public string NextPage(int currentPage, int blogId){
     List<Blog> blogs = db.Blogs.ToList();
     List<Profile> profiles = db.Profiles.ToList();
     var blog = blogs.FirstOrDefault(b => b.Id == blogId);
     var detailsCount = blog.BlogDetails.Count();
     if (currentPage == detailsCount - 1)
     {
         ViewBag.currentPage = Session["currentPage"] = currentPage;
     }
     else
     {
         ViewBag.currentPage = Session["currentPage"] = currentPage + 1;
     }
     ViewBag.blogId = blogId;
     Session["blogTitle"] = blog.Title;
     if (blog.BlogDetails.Any())
     {
         return blog.BlogDetails[ViewBag.currentPage].BlogPage;
     }
     else
     {
         return " ";
     }
 }



[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public JsonResult UpdateTitleServer(){
    var title = Session["blogTitle"];
    int blogId = (int)Session["blogId"];
    var currentPage = (int)Session["currentPage"];
    var result = new {
        Title = title.ToString(),
        BlogPrevLink = string.Format("/BloggerHome/PreviousPage?currentPage={0}&amp;blogId={1}",currentPage,blogId),
        BlogNextLink = string.Format("/BloggerHome/NextPage?currentPage={0}&amp;blogId={1}",currentPage,blogId)
    };
    return Json(result,JsonRequestBehavior.AllowGet);
}
@Ajax.ActionLink("<----", "PreviousPage","BloggerHome", new { currentPage = ViewBag.currentPage, blogId = ViewBag.blogId }, new AjaxOptions() {HttpMethod="Post", OnComplete="UpdateTitleClient", UpdateTargetId = "contentPanel" }, new {Id="PrevPage"})

@Ajax.ActionLink("---->", "NextPage","BloggerHome", new { currentPage = ViewBag.currentPage, blogId = ViewBag.blogId }, new AjaxOptions() {HttpMethod="Post",OnComplete="UpdateTitleClient",UpdateTargetId="contentPanel" },new {Id="NextPage"});
function UpdateTitleClient() {
     $.getJSON("BloggerHome/UpdateTitleServer", function (data) {
         $("#blogTitle").html(data.Title);
         $("#PrevPage").attr("href", data.BlogPrevLink);
         $("#NextPage").attr("href", data.BlogNextLink);
     });
}
请记住,getJSON()是一个异步方法,因此,如果使用调试器单步执行代码,事件序列可能不太可预测

getJSON()没有async:false设置,所以只需使用ajax,将async设置为false,将dataType设置为json。如下所示:

 $.ajax({
      dataType: "json",
      url: yoururl,
      async: false,
      data: data,
      success: function (data) {
             $("#blogTitle").html(data.Title);
             $("#PrevPage").attr("href", data.BlogPrevLink);
             $("#NextPage").attr("href", data.BlogNextLink);
         }

});
包含Jquery验证脚本的行@Scripts.Render(“~/bundles/jqueryval”)导致控制器方法调用两次。我不确定这是为什么导致问题。一旦删除这一行,它只调用控制器方法一次

这就是我的脚本头以前的样子

<head>
        <meta charset="utf-8" />
        <title>Test</title>

        <meta name="viewport" content="width=device-width" />
        <script type="text/javascript" src="~/Scripts/jquery-1.8.2.min.js" ></script>
        <script type="text/javascript" src="~/Scripts/jquery-ui-1.8.24.js" ></script>
        <script type="text/javascript" src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
        @Scripts.Render("~/bundles/jquery")
        **@Scripts.Render("~/bundles/jqueryval") // Removed this line**
    </head>

试验
@style.Render(“~/Content/css”)
@Scripts.Render(“~/bundles/modernizer”)
@Scripts.Render(“~/bundles/jquery”)
**@Scripts.Render(“~/bundles/jqueryval”)//删除了此行**

此问题是由于添加了两次jquery引用

第一点是:

 **<script type="text/javascript" src="~/Scripts/jquery.unobtrusive-ajax.min.js"</script>**
上行将向网页添加三个脚本

**<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>**
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
****

突出显示的两个脚本标记是重复的,这导致控制器方法被调用两次。我删除了其中一个,现在可以正常工作。

您说:“我已经放下了我正在使用的代码。”这是否包括没有代码的带有主体块的控制器方法?IOW--这真的是这个方法的样子吗:
public JsonResult UpdateTitleServer(){}
?@DavidTansey,更新了代码我尝试了代码,但不幸的是问题仍然存在。我能够通过从Ajax.ActionLink()方法中删除新的{Id=“PrevPage”}来解决第一个问题。我不知道为什么,但它是有效的!!!。我关于控制器方法被调用两次的第二个问题仍然存在。我发现是谁导致了控制器方法被调用两次的问题。就是这一行@Scripts.Render(“~/bundles/jqueryval”),Jquery验证脚本包含。我不知道这是为什么会导致问题,请有人帮助meHi Chandan,这里说使用bundles是可选的:可以尝试删除对它的引用并重试吗?删除@Scripts.Render(“~/bundles/jqueryval”)行可以解决操作方法被调用两次的问题。
**<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>**
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>