Jquery ASP.NET MVC局部视图+;Ajax加载
我正在处理一个项目,为了避免每次页面更改都会重新加载布局视图,我决定将视图更改为部分视图。为了在用户单击导航菜单中的一个菜单项时加载视图,我现在使用jquery ajax,如下所示:-Jquery ASP.NET MVC局部视图+;Ajax加载,jquery,ajax,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-5,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc 5,我正在处理一个项目,为了避免每次页面更改都会重新加载布局视图,我决定将视图更改为部分视图。为了在用户单击导航菜单中的一个菜单项时加载视图,我现在使用jquery ajax,如下所示:- $("ul.metismenu a:not(.subMenuParent)").unbind().click(function (e) { e.preventDefault(); var url = $(this).attr("href"); window.history.pushSt
$("ul.metismenu a:not(.subMenuParent)").unbind().click(function (e) {
e.preventDefault();
var url = $(this).attr("href");
window.history.pushState("", "", url);
$.ajax({
url: url,
dataType: 'html',
success: function (data) {
$('#page-content').html(data);
}
});
});
@{
Layout = ViewBag.Layout;
}
元素页面内容位于布局视图中。它工作正常,但是我现在遇到的问题是,当我尝试直接访问视图时,比如说直接在浏览器中访问我的go/Dashboard,我只会得到部分视图,而没有布局页面。有人知道我怎么解决这个问题吗?提前感谢您的建议。您的url调用
MVC操作
,返回操作结果
:PartialView()
您可以使用变量从不同的控制器操作设置不同的布局。即使是一个可视包也足够了。对于操作面板,可以将ViewBag.Layout(比如)设置为布局html,对于部分视图,可以将ViewBag.Layout设置为空。然后在html页面中使用此变量。因此,根据我们调用的操作,将选择正确的布局。我能够通过首先检查请求是否是ajax请求来解决这个问题。然后根据请求的类型设置布局视图。这是一个操作的示例代码:-
public ActionResult Index()
{
if (!Request.IsAjaxRequest())
{
ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
}
return PartialView();
}
在局部视图中,我设置了以下内容:-
$("ul.metismenu a:not(.subMenuParent)").unbind().click(function (e) {
e.preventDefault();
var url = $(this).attr("href");
window.history.pushState("", "", url);
$.ajax({
url: url,
dataType: 'html',
success: function (data) {
$('#page-content').html(data);
}
});
});
@{
Layout = ViewBag.Layout;
}
希望这对可能遇到同样问题的人有所帮助。只需添加
@{Layout=“~/Views/Shared/\u Layout.cshtml”}
在您的部分视图中。@mmushtaq我已经尝试过了,但是布局被渲染了两次,那么您可以分享返回部分视图的控制器操作的方式吗?我的操作返回一个操作结果,它已经返回部分视图()尝试添加@{Layout=string.Empty;}
或者结果是默认情况下不包括jquery.unobtrusive ajax.js
。添加它可以解决问题。谢谢你为我指明了正确的方向。我发布了我提出的修复方案,并将您的反馈标记为答案,因为多亏了您,我才提出了这个想法。很高兴这有帮助!!