我想有2个单独的布局在我的应用程序。让我们说一个是为网站的公共部分,另一个是为会员方。

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

PublicController StaffController

它们每个都有一个对应的视图布局。

_PublicLayout.cshtml _StaffLayout.cshtml

我如何使用_ViewStart。cshtml文件指定“公共”下的所有视图/操作使用的PublicLayout和“人员”下的一切使用的StaffLayout?


当前回答

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

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

通过类比,你可以放另一个_ViewStart。在/Views/Staff文件夹中的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();
}

其他回答

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

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

通过类比,你可以放另一个_ViewStart。在/Views/Staff文件夹中的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();
}

这个方法是初学者在你的ASP中控制布局渲染的最简单的方法。NET MVC应用程序。我们可以识别控制器并将布局渲染为par控制器,为此我们可以在Views文件夹根目录下的_ViewStart文件中编写代码。下面是一个示例,说明如何做到这一点。

@{
    var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
    string cLayout = "";

    if (controller == "Webmaster")
        cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
    else
        cLayout = "~/Views/Shared/_Layout.cshtml";
    
    Layout = cLayout;
}

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

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

更多的方法,可以在这里找到,希望这能帮助到一些人。