所以,我个人认为这是一种打击。
我将 .aspx 模板放在非标准位置。在这个例子中,它有一个虚拟路径~/Content/Sites/magical/Index.aspx
。
然后我创建了自己的视图引擎作为测试,它扩展了 WebFormsViewEngine:
public class MagicalWebFormsViewEngine : WebFormViewEngine
{
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
string viewTemplatePath = "~/Content/Sites/magical/" + viewName + ".aspx";
string masterTemplatePath = string.Empty;
return new ViewEngineResult(
this.CreateView(controllerContext, viewTemplatePath, masterTemplatePath),
this
);
}
}
模板如下所示:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Plain.Master" Inherits="System.Web.Mvc.ViewPage<MySoln.Client.Presentation.MyPresenter>" %>
...
<%: Model.SomePresenterSpecificMember %>
如果我将强类型声明保留在声明的Inherits
属性中,Page
则会出现以下异常:
解析器错误消息:无法加载类型“System.Web.Mvc.ViewPage<MySoln.Client.Presentation.MyPresenter>”。
但是,如果我将模板更改为使用弱类型页面模型,而是在模板本身的 Model 成员上使用强制转换,则它可以工作:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Plain.Master" Inherits="System.Web.Mvc.ViewPage" %>
...
<% var omg = (MySoln.Client.Presentation.MyPresenter) Model; %>
<%: omg.SomePresenterSpecificMember %>
所以,我的问题是,为什么前者的 barf 和后者的工作?我宁愿不要在每个模板顶部的标记中将 Model 转换为我的演示者类型之一。
谢谢!