3

前と次の 2 つのナビゲーション ハイパーリンクを持つページを実装しています。

最初の問題、ハイパーリンクをクリックするたびに、初めてアクションが呼び出されます。2 回目以降は、コントローラーでのアクション メソッドの呼び出しを停止します。ブラウザがリンクをキャッシュしていることは知っています。だから私はコードを使用しましたOutputCache...が、それでも機能しません。

2 つ目の問題は、ハイパーリンクの 1 回のクリックでアクション メソッドが 2 回呼び出されることです。

ここで何が欠けているのか誰か教えてもらえますか? 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"});

JavaScript メソッド:

function UpdateTitleClient() {
     $.getJSON("BloggerHome/UpdateTitleServer", function (data) {
         $("#blogTitle").html(data.Title);
         $("#PrevPage").attr("href", data.BlogPrevLink);
         $("#NextPage").attr("href", data.BlogNextLink);
     });
}
4

3 に答える 3

0

行 @Scripts.Render("~/bundles/jqueryval") に Jquery 検証スクリプトが含まれていると、コントローラー メソッドが 2 回呼び出されます。これが問題を引き起こしている理由はわかりません。この行が削除されると、コントローラー メソッドが 1 回だけ呼び出されます。

これは私のスクリプトヘッダーが以前のように見えた方法です

<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>
于 2013-09-02T22:12:24.450 に答える
0

この問題は、jquery 参照が 2 回追加されていることが原因です。

最初の参照は次のとおりです。

 **<script type="text/javascript" src="~/Scripts/jquery.unobtrusive-ajax.min.js"</script>**

2 番目の参照は次の行によるものでした:

 @Scripts.Render("~/bundles/jqueryval")

上記の行は、Web ページに 3 つのスクリプトを追加します。

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

強調表示された 2 つのスクリプト タグは重複しているため、コントローラー メソッドが 2 回呼び出されました。それらの1つを削除しましたが、現在は正常に機能しています。

于 2013-09-09T03:24:22.893 に答える