【问题标题】:Set Layout for Single paged application in ASP.NET MVC在 ASP.NET MVC 中为单页应用程序设置布局
【发布时间】:2016-04-25 17:01:07
【问题描述】:

我是 MVC 新手,正在尝试创建单页应用程序。

我在_Layout.cshtml中的内容

<section class="content-wrapper main-content clear-fix">
    @Html.Action("Index", "MenuNavigation", "U01")

    @RenderBody()
</section>

注意:@Html.Action("Index", "MenuNavigation", "U01") 是我从数据库渲染动态导航菜单的地方(只会从数据库加载一次)

下面是我的_MainLayout.cshtml,它使用_Layout.cshtml 作为母版页

@{
    ViewBag.Title = "";
    Layout = "_Layout.cshtml"; 
}

<div id="MainPageContent">
@RenderBody()
</div>

这是我的Home\Index 视图

@{
    ViewBag.Title = "Home Page";
    if (ViewBag.IsRequestFromLoginPage !=null && ViewBag.IsRequestFromLoginPage)
    {
        Layout = "~/Views/Shared/_MainLayout.cshtml";
    }
    else
    {
        Layout = null;
    }
}
@Html.AntiForgeryToken()
<h2>Home</h2>

这里是各自的Home控制器

public ActionResult Index()
{
    ViewBag.IsRequestFromLoginPage = TempData[Constants.TempData.IsUserFromLogin];
    TempData[Constants.TempData.IsUserFromLogin] = false;
    return View();
}

当用户登录到我的网站时,我想渲染我的Home\Index 并仅在第一次加载时加载我的导航菜单(部分内容)。

如果用户选择任何菜单项,我正在执行 AJAX 调用以更新 _MainLayout.cshtml 中的 MainPageContent 通过这种方式我正在尝试创建单页应用程序但问题是当用户刷新页面时浏览器网址。例如:如果用户在“MyApp.com/Home”中并刷新浏览器,由于ViewBag.IsRequestFromLoginPage 签入我的Home 页面,它会导致我的应用程序丢失其_layout(仅呈现主页内容)。

不确定这是实现此目的的正确方法。有没有其他方法可以这样做。任何帮助将不胜感激。谢谢!

这是我的布局的样子>

@丹尼尔

【问题讨论】:

  • 更改您的 if 条件以仅测试它是否为空。喜欢if(ViewBag.IsRequestFromLoginPage != null)
  • @jamiedanq 但我不确定这是不是正确的做法。如果我在 home 内再次向 Home 发出请求,它将在我的 maincontent 中复制 _layout 内容。

标签: asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

你的代码有点多余,如果你说它的主布局是_Layout.cshtml,你为什么在_MainLayout.cshtml 中有@RenderBody(),它也调用@RenderBody?而不是使用@Html.Action@RenderBody() 使用Html.RenderAction (当调用不是索引的不同方法时)并且不为您的视图指定布局,以同样的方式,摆脱所有验证以查看是否它是否来自登录页面,请注意 Index 方法始终默认进入,因此如果您正在访问 Home Controller,实际上甚至不需要调用任何类型的 HTML 操作,您可以像这样离开您的主布局

<section class="content-wrapper main-content clear-fix">   
<div id="MainPageContent">
@RenderBody()
</div>

</section>

你的索引视图是这样的:

@Html.AntiForgeryToken()
<h2>Home</h2>

在不同的 ActionResult 方法中,您可以像这样加载与 Index 相同的视图:

public ActionResult update(){
return View("Index");
}

然后,您将进行 AJAX 调用以使用该方法而不是“Index”填充“MainContentPage”div。

【讨论】:

  • 我尝试按照您提到的方式进行操作,但问题是我正在执行 AJAX 调用来更新我的内容,当我单击菜单中的主页链接时,实际上是在重复我的内容。请参考我现在附上的图片。@Daniel
  • 不要对“主页”本身进行 ajax 调用,而是对“主页/索引”进行 ajax 调用,或者在单击主页时根本不进行 AJAX 调用,只需刷新页面即可。检查我更新的答案。
  • 你想让我阻止 AJAX 调用 Home 吗? @丹尼尔
  • 猜猜,这会奏效。让我试着回复你。谢谢。 @丹尼尔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多