【问题标题】:Can a Razor _Layout view only be applied to Pages that inherit from a particular interface?Razor _Layout 视图是否只能应用于从特定界面继承的页面?
【发布时间】:2021-02-08 15:18:58
【问题描述】:

我有兴趣向一组页面添加“添加到仪表板”功能,这些页面具有我通过反射确定的功能([attribute]IMyFeatureOrSolution。)

与其确定哪些页面需要使用不同的~/shared/_Layout.cshtml,我想使用一种不同的方法来保持“OOP-y”。

如果我的想法可行,这是不是一个坏主意(Asp.core 性能、缓存、对许多不同或相似页面的内存影响)?

实现这一点的正确方法是什么,或者还有哪些其他注意事项和注意事项? (或者我错过了一天在学校分享“更好的方法”的课堂?)

如果在 Razor 页面中支持,因为 IPersonalData 存在于此页面上, 控制器(或数据[属性]等,理论上......)然后数据将是

  • 以一组方式自动保护(加密、替换、差分 ngram、更改索引号 (bool:discardmap|bool:detectNew,bool:applydiffupdates))
  • 链接到包含私有数据导出的 ASP.NET 身份验证页面。请求删除或其他可能需要的状态 批准工作流程(finra 电子邮件主机,好像他们会使用默认 模板,但它有助于客户思考)
  • ^是软件中的三个^^^ for/as/by example

【问题讨论】:

标签: asp.net-core razor asp.net-core-5.0


【解决方案1】:

一般情况下,我们可以通过setting the Layout property on the view page改变布局。

Razor _Layout 视图是否只能应用于继承自 特定的界面?

是的,您可以根据页面模型是否继承自特定接口来更改布局。要实现它,请参考以下步骤:

首先,您可以使用 Type.IsAssignableFrom() 方法来检查页面模型是否继承自特定接口,代码如下:

这里,我添加了一个关于AboutModel的About页面,并继承自IMyCustomInterface接口,代码在About.cshtml.cs页面中:

public class AboutModel : PageModel, IMyCustomInterface
{
    public void OnGet()
    {
        var isInherit = typeof(IMyCustomInterface).IsAssignableFrom(typeof(AboutModel));
        
        ViewData["IsInherit"] = isInherit;
    }
}

然后,在 About 视图页面(About.cshtml)中,我们可以从 ViewData 中获取结果,然后根据条件设置 Layout 属性:

@{
    if (ViewData["IsInherit"] != null)
    {

        var isInherit = (bool)ViewData["IsInherit"];
        if (isInherit)
        {
            Layout = "~/Pages/Shared/_Layout.cshtml"; //using default layout 
        }
        else
        {
            Layout = "~/Pages/Shared/_MyCustomLayout.cshtml"; //using custom layout
        }

    }
}

对于性能问题,在我看来,通过使用上述方法,我们只是习惯于检查页面模型是否继承自特定接口,因此,它是完全可以接受的,您不会注意到它有任何延迟.

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多