我该如何在ASP.NET MVC 3 Razor ViewStart文件中指定不同的布局?

20 浏览
0 Comments

我该如何在ASP.NET MVC 3 Razor ViewStart文件中指定不同的布局?

我希望在我的应用程序中拥有两个不同的布局。比如说一个用于网站的公共部分,另一个用于会员端。

为了简单起见,假设每个站点的所有逻辑都被整洁地包含在两个不同的控制器中。

  • PublicController
  • StaffController

并且它们都有对应的布局以适用它们下面所有的视图。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

我该如何使用_ViewStart.cshtml文件来指定所有在“Public”下面的视图/操作都使用PublicLayout,而在“Staff”下面的所有内容都使用StaffLayout?

admin 更改状态以发布 2023年5月23日
0
0 Comments

还有一种方法是在视图内部定义布局:

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

更多做法可以在这里找到,希望对某些人有所帮助。

0
0 Comments

您可以在/ Views / Public 文件夹中放置一个 _ViewStart.cshtml 文件,它将覆盖/ Views 文件夹中的默认文件,并指定所需的布局:

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

类比的,您可以在/ Views / Staff 文件夹中放置另一个 _ViewStart.cshtml 文件,其中包含:

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

您还可以指定在返回控制器操作中的视图时应使用哪个布局,但这是每个操作的指定:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

还有一种可能性是自定义操作过滤器,它将覆盖布局。如您所见,有许多实现此目的的可能性。由您选择最适合您场景的方法。


更新:

在评论部分请求的是一个选择主页面的操作过滤器,下面是一个示例:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

然后将控制器或操作装饰为此自定义属性,指定所需的布局:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

0