.NET MVC 3以编程方式设置布局

jaa*_*aap 5 layout razor asp.net-mvc-3

在.NET Razor Web应用程序中,我正在尝试以编程方式设置Layout.我不能使用_ViewStart.cshtml,也不会@{ Layout = "..." }在每个页面上设置.这就是我想出的:

WebViewPage类:

public abstract class SitePage<T> : System.Web.Mvc.WebViewPage<T>
{
    private object _layout;

    public new dynamic Layout { get { return _layout; } }

    public override void InitHelpers()
    {
        base.InitHelpers();
        _layout = "~/Themes/" + Settings.Theme + "/Views/_Layout.cshtml";
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序中,web.config我指定所有视图以使用此基页.但Layout似乎从未使用过.这可能有什么问题?

jav*_*iry 9

WebViewPage类继承WebPageBase,有一个命名的属性Layout,如:

public override string Layout { get; set; }
Run Code Online (Sandbox Code Playgroud)

您可以覆盖Layout属性,或更改_layout逻辑以实现您的目的.例如:

public abstract class SitePage<T> : System.Web.Mvc.WebViewPage<T> {

    // set this modifier as protected, to make it accessible from view-pages
    protected string _layout{
        get {
            return base.Layout;
        }
        set {
            base.Layout = value;
        }
    }

    public override void InitHelpers() {
        base.InitHelpers();
        _layout = "~/Themes/" + Settings.Theme + "/Views/_Layout.cshtml";
    }
}
Run Code Online (Sandbox Code Playgroud)

和/或在视图页面中,您也可以设置它:

@{
    _layout = "_Your_Special_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

更新:使用一个标志来避免在多次分配_layout时堆栈溢出:

public abstract class SitePage<T> : System.Web.Mvc.WebViewPage<T> {

    public bool LayoutAssigned {
        get {
            return (ViewBag.LayoutAssigned == true);
        }
        set {
            ViewBag.LayoutAssigned = value;
        }
    }

    // set this modifier as protected, to make it accessible from view-pages
    protected string _layout{
        get {
            return base.Layout;
        }
        set {
            base.Layout = value;
        }
    }

    public override void InitHelpers() {
        base.InitHelpers();
        if(!LayoutAssigned) {
            _layout = "~/Themes/" + Settings.Theme + "/Views/_Layout.cshtml";
            LayoutAssigned = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


nia*_*her 5

我试图通过实现自定义WebViewPage来实现同样的目的,但是在我的自定义类中更改WebViewPage.Layout没有任何效果(正如您也发现的那样).

最后我最终改变了我的_ViewStart.cshtml来获得这段代码:

@{
    this.Layout = this.Request.QueryString["print"] == "1" 
        ? "~/Views/Layout/_Print.cshtml"
        : "~/Views/Layout/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

它可能没有按照你想要的方式实现,但它肯定会让事情变得干燥,这是重点.