Spark View Engine:如何设置默认母版页名称?

时间:2010-12-28 15:38:36

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

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

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

其他可能性是:

  1. 分别在每个火花文件中设置主文件<use master="Default" />。但那真的很烦人。

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

3 个答案:

答案 0 :(得分:4)

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

  1. 工作量减少 - 但重复性更高。
  2. 开展更多工作,但推出了您的首选惯例。
  3. 少工作

    使用任何ActionResult,您只需在return语句中添加第二个参数即可指定要使用的主控名称:

    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);
        }
    

    然后它会在找到Default.spark之前找到你的Application.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应该查找主视图的位置以及名称的位置。

    希望有所帮助,
    一切顺利,
    RobertTheGrey

答案 1 :(得分:0)

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

<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'"/>

另一个很酷的功能

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

而不是写

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

答案 2 :(得分:0)

不是使用Application.spark作为基础,而是使用Default.spark作为第二级... 将Default.spark重命名为Application.spark,将application.spark重命名为BaseApplication.spark。

这样,默认情况下你的application.spark被选中,但如果你想覆盖它,你可以引用BaseApplication.spark。

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