asp.net-mvc - Spark View 引擎: How to set default master page name?

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

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

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

其他可能性是:

  1. 分别在每个spark文件中设置master <use master="Default" /> 。但这确实很烦人。

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

最佳答案

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

  1. 工作量减少 - 但重复性增加。
  2. 需要更多工作,但会影响您偏好的约定。

减少工作量

对于任何 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/

相关文章:

c# - 如何通过 Ajax Begin 表单正确使用分部 View

c# - 重定向后 HttpPost 到 ReturnURL

asp.net - 创建适合任何屏幕分辨率的母版页

java - Struts2中validate和model方法获取属性值的区别

visual-studio-2010 - 在 VS2010 中禁用代码折叠中的双行距

c# - 母版页Page_Load方法运行在aspx页面Page_Load方法之后

css - vb 网站在 IIS7 上安装时无法正确显示

c# - 如何在 Unity 中使用 Serilog?

asp.net-mvc - ActionLink 没有将参数传递给 Controller ​​——asp.Net MVC 4

java - 应用程序服务器和本地 Eclipse 的 Hibernate 外部配置设计