【问题标题】:Partial view inherits from master layout部分视图继承自主布局
【发布时间】:2011-07-01 10:05:12
【问题描述】:

我有一个局部视图和 int 它,没有任何布局的任何继承痕迹。但是每当我想在视图中使用它(渲染它)时,布局都会为视图重复一次,而对于局部视图则重复一次。 This post 建议创建一个空布局。但我认为这是解决方法。无论如何要停止加载部分视图的布局(主布局)。我不明白,为什么当没有使用主布局的代码时,为什么要加载它。这就像在 ASP.NET 中创建一个页面并看到它从母版页继承而没有 <%@ Master ... 指令。

这是我的部分观点:

@* Recursive category rendering *@
@using Backend.Models;

@{
    List<Category> categories = new ThoughtResultsEntities().Categories.ToList();
    int level = 1;
 }

 @RenderCategoriesDropDown(categories, level)

 @helper RenderCategoriesDropDown(List<Category> categories, int level)
 {
     List<Category> rootCategories = categories.Where(c => c.ParentId == null).ToList();
     <select id='categoriesList' name='categoriesList'>
     @foreach (Category rootCategory in rootCategories)
     {
         <option value='@rootCategory.Id' class='level-1'>@rootCategory.Title</option>
         @RenderChildCategories(categories, level, rootCategory.Id);
     }
     </select>
 }

 @helper RenderChildCategories(List<Category> categories, int level, int  parentCategoryId)
 {
     string padding = string.Empty;
     level++;
     List<Category> childCategories = categories.Where(c => c.ParentId == parentCategoryId).ToList();
     foreach (Category childCategory in childCategories)
     {
          <option value='@childCategory.Id' class='level-@level'>@padding.PadRight(level, '-') @childCategory.Title</option>
          @RenderChildCategories(categories, level, childCategory.Id);
     }
     level--;
 }

【问题讨论】:

  • 你能显示你的部分页面的第一行和你的控制器操作方法吗?

标签: asp.net-mvc asp.net-mvc-3 layout master-pages partial-views


【解决方案1】:

通过 ajax 调用呈现部分页面时,我能够重现此问题。

return View("partialpage")   

总是伴随着布局。我已通过显式调用

来覆盖此行为
return PartialView("partialpage")  

【讨论】:

  • 良好做法。我不知道 PartialView 是 ActionResult 类型之一。但是,当您不使用 ajax 并且想要基于将一些部分视图(类似于仪表板)组合在一起来构建页面时,您会做什么。哪种方法?
  • 我根据模型的可用性使用 RenderPartial 或 RenderAction
【解决方案2】:

布局可能来自您的~/Views/_ViewStart.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

您可以尝试在部分视图中覆盖它,例如:

@{
    Layout = null;
}

【讨论】:

  • 这对我有用。谢谢你。但这不是很奇怪吗?在 WebForms 中,就像总是说“此页面没有母版页”或“此用户控件没有母版页”。我的意思是,似乎默认值应该是 Layout = null; 并且不应该明确地说出来。
  • WebForms 视图引擎使用了不同的文件扩展名(.ascx 代表部分,.aspx 代表页面)。另一方面,Razor 对所有内容都使用相同的扩展名,所以这可能是原因(虽然不是 100% 肯定)。顺便说一句,我无法重现您的问题。你怎么称呼你的部分?我尝试使用 @Html.Partial("_Foo") 并且它确实有效。无需将 Layout 设置为 null。
  • 我使用了@Html.Action("PartialViewControllerAction")。方法文档说它返回部分视图执行的渲染结果。
  • 好的,那么您将调用子操作而不是局部视图。让我看看我现在能不能复制它。
  • 在您的孩子行动中,您是否有机会使用return View();?因为如果你这样做return PartialView();,布局会自动为你删除。
猜你喜欢
  • 1970-01-01
  • 2019-10-16
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多