我使用带有嵌套母版页的 Spark View Engine。我有 Application.spark 它定义了网站的基本布局。还有其他几个母版本身使用 Application.spark 作为母版页(Default.spark、SinlgeColumn.spark、Gallery.spark...)
如果 View 文件中未指定母版页,则 Spark View 引擎会自动选择 Application.spark。由于我的几乎所有页面都使用“Default.spark”作为主页面,有没有办法进行全局配置?
其他可能性是:
分别在每个spark文件中设置master
<use master="Default" />
。但这确实很烦人。重命名我的主文件(Default.spark <-> Application.spark),但这在命名中确实没有任何意义。
最佳答案
有两种方法可以解决您的问题:
- 工作量减少 - 但重复性增加。
- 需要更多工作,但会影响您偏好的约定。
减少工作量
对于任何 ActionResult
,您只需在 return 语句中添加第二个参数即可指定要使用的 master 的名称:
return View("Gallery", "Default");
第一个参数名称是 View ,第二个参数名称表示母版页覆盖...但这确实意味着您需要在各处重复它,而且这并不比以前好多少。
更多工作
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
的类,并覆盖上面提到的该方法,并在注册 View 引擎时使用它像这样:
public static void RegisterViewEngine(ICollection<IViewEngine> engines)
{
var services = SparkEngineStarter.CreateContainer();
services.SetServiceBuilder<IDescriptorBuilder>(
c => new MyDescriptorBuilder());
SparkEngineStarter.RegisterViewEngine(services);
}
这意味着您现在可以指示 Spark 应在何处查找主视图以及名称。
希望有帮助,
祝一切顺利,
罗伯特·格雷
关于asp.net-mvc - Spark View 引擎: How to set default master page name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4547181/