我将Spark View Engine与嵌套母版页一起使用。我有Application.spark,它定义了网站的基本布局。然后有几个其他大师自己使用Application.spark作为母版页(Default.spark,SinlgeColumn.spark,Gallery.spark,...)
如果视图文件中未指定母版页,则Spark View引擎会自动选择Application.spark。由于我的几乎所有页面都使用“Default.spark”作为主页,有没有办法全局配置?
其他可能性是:
分别在每个火花文件中设置主文件<use master="Default" />
。但那真的很烦人。
重命名我的主文件(Default.spark&lt; - &gt; Application.spark),但在命名方面确实没有任何意义。
答案 0 :(得分:4)
有两种方法可以解决您的问题:
使用任何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