MVC中绑定控制器方法的问题
本文关键字:问题 方法 控制器 绑定 MVC | 更新日期: 2023-09-27 18:29:54
我正在实现一个具有两个导航超链接的页面:Previous和next。
第一个问题,每次我点击超链接,它都会第一次调用该操作。第二次以后,它停止调用控制器上的操作方法。我知道浏览器缓存链接。所以我使用了代码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}&blogId={1}",currentPage,blogId),
BlogNextLink = string.Format("/BloggerHome/NextPage?currentPage={0}&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);
});
}
请记住,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);
}
});
行@Scripts.Render("~/bundles/jqueryval"),Jquery验证脚本包含导致控制器方法调用两次。我不确定这是为什么会导致这个问题。一旦删除了这一行,它只调用控制器方法一次。
这就是之前我的脚本头的样子
<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>
此问题是由于jquery引用被添加了两次。
第一个参考文献是:
**<script type="text/javascript" src="~/Scripts/jquery.unobtrusive-ajax.min.js"</script>**
第二次引用是由于以下行:
@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>
两个突出显示的脚本标记是重复的,这导致控制器方法被调用两次。我去掉了其中一个,现在效果很好。