【问题标题】:Spark View Engine: How to set default master page name?Spark View Engine:如何设置默认母版页名称?
【发布时间】:2010-12-28 15:38:36
【问题描述】:

我使用带有嵌套母版页的 Spark View Engine。我有 Application.spark,它定义了网站的基本布局。然后还有其他几个大师自己使用 Application.spark 作为母版页(Default.spark、SinlgeColumn.spark、Gallery.spark、...)

如果没有在视图文件中指定母版页,则 Spark 视图引擎会自动选择 Application.spark。由于我几乎所有页面都使用“Default.spark”作为主页面,有没有办法全局配置它?

其他可能性是:

  1. 在每个 spark 文件中单独设置 master <use master="Default" />。但这真的很烦人。

  2. 重命名我的主文件(Default.spark Application.spark),但这在命名方面确实没有任何意义。

【问题讨论】:

    标签: asp.net-mvc configuration master-pages spark-view-engine


    【解决方案1】:

    有两种方法可以解决您的问题:

    1. 工作量更少 - 但重复性更高。
    2. 更多的工作,但排除了您喜欢的惯例。

    减少工作量

    对于任何ActionResult,您可以简单地在return 语句中添加第二个参数来指定要使用的master 的名称:

    return View("Gallery", "Default");
    

    第一个参数名称是视图,第二个表示母版页覆盖...但这确实意味着您需要在任何地方重复它,这并不比以前的更好。

    更多工作

    Spark 定位要使用的母版页的方式是通过框架中的以下代码:

    protected virtual IEnumerable<string> PotentialDefaultMasterLocations(string controllerName, IDictionary<string, object> extra)
        {
            return ApplyFilters(new[]
                                    {
                                        "Layouts\\" + controllerName + ".spark",
                                        "Shared\\" + controllerName + ".spark",
                                        "Layouts\\Application.spark",
                                        "Shared\\Application.spark"
                                    }, extra);
        }
    

    请注意其中的硬编码 Application.spark - 这是 Spark 约定。您似乎想要做的是覆盖此方法并放入类似的内容:

    protected virtual IEnumerable<string> PotentialDefaultMasterLocations(string controllerName, IDictionary<string, object> extra)
        {
            return ApplyFilters(new[]
                                    {
                                        "Layouts\\" + controllerName + ".spark",
                                        "Shared\\" + controllerName + ".spark",
                                        "Layouts\\Default.spark",
                                        "Shared\\Default.spark"
                                        "Layouts\\Application.spark",
                                        "Shared\\Application.spark"
                                    }, extra);
        }
    

    然后它会在找到Application.spark 之前找到您的Default.spark,或者如果它不适合您并且您更喜欢您的约定,您可以完全摆脱Application.spark...

    为了覆盖它,您需要做的就是创建一个继承自Spark.Web.Mvc.DefaultDescriptorBuilder 的类并覆盖上面提到的该方法,并在您注册视图引擎时使用它,如下所示:

    public static void RegisterViewEngine(ICollection<IViewEngine> engines)
    {
        var services = SparkEngineStarter.CreateContainer();
        services.SetServiceBuilder<IDescriptorBuilder>(
            c => new MyDescriptorBuilder());
        SparkEngineStarter.RegisterViewEngine(services);
    }
    

    这意味着您现在可以指示 Spark 应在何处查找主视图以及名称将是什么。

    希望对您有所帮助,
    万事如意,
    罗伯特·格雷

    【讨论】:

    • “更多工作”方法也可用于创建“主题”系统(CMS、博客等)。
    • 谢谢罗伯特,这太棒了!我认为“Less Work”的方法比在每个视图中设置master还要糟糕,所以我选择了“More work”。这是一个非常干净(且可扩展)的解决方案。
    • 我完全同意——我什至不记得如何做“更少的工作”选项——必须查一下;-)。如果我能提供帮助,我不喜欢围绕代码运行的任何魔术字符串,但它的存在是为了与本机 WebForms 兼容,那该怎么办呢?很高兴您选择了第二个选项,从长远来看,实际上工作量更少;-)
    【解决方案2】:

    不知道是否有效,但尝试添加

    <use master="Default" />
    

    在名为Views\_global.spark 的文件中。它会自动包含在所有视图中。

    我通常将命名空间和全局变量添加到我的_global.spark

    例子:

    <use namespace="System.Collections.Generic"/>
    <use namespace="System.Web.Mvc.Html"/>
    
    <global type="string" Title="'My default title'"/>
    

    另一个很酷的功能

    由于您是 spark 新用户,我想向您展示另一个很酷的 spark 功能。

    而不是写

    Html.LabelFor(Model => Model.FirstName);
    

    你可以写

    <Label For="FirstName" />
    

    使视图更清晰,对吧?魔术是通过称为绑定的东西完成的。您需要做的就是创建一个Views\Bindings.xml 文件并向其添加绑定。

    阅读这篇博文了解更多信息:http://blog.robertgreyling.com/2010/08/spark-bindings-are-you-tired-of-eating.html

    【讨论】:

    • 感谢您的回答。不幸的是,将&lt;use master="Default" /&gt; 添加到_global.spark 没有用——我以前试过。是的,我知道 Spark 的其他一些很酷的功能,我对它并不陌生。除了简洁的语法之外,这些额外的小东西是我喜欢 Spark 的原因! :-)
    【解决方案3】:

    而不是使用 Application.spark 作为您的基础,并将 Default.spark 作为您的第二级... 将 Default.spark 重命名为 Application.spark 并将 application.spark 重命名为 BaseApplication.spark 之类的其他名称。

    这样,默认情况下会选择您的 application.spark,但如果您希望覆盖它,您可以引用 BaseApplication.spark。

    有关示例,请参见三遍渲染部分。 http://sparkviewengine.com/documentation/master-layouts#Threepassrendering

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多