如何将强类型视图 WebForms .aspx 模板放置在 ASP.NET MVC2 中的非标准位置?
所以,我个人认为这是一种打击。
我将 .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
属性中, code>Page 声明时,出现以下异常:
解析器错误消息:无法加载类型“System.Web.Mvc.ViewPage”。
但是,如果我将模板更改为使用弱类型页面模型,并在模板本身的 Model 成员上使用强制转换,则它可以工作:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Plain.Master" Inherits="System.Web.Mvc.ViewPage" %>
...
<% var omg = (MySoln.Client.Presentation.MyPresenter) Model; %>
<%: omg.SomePresenterSpecificMember %>
所以,我的问题是,为什么前者会这样?呕吐和后者有效吗?我不想在每个模板顶部的标签中将 Model 转换为我的演示者类型之一。
谢谢!
So, I personally think this is sort of whack.
I put a .aspx template in a nonstandard location. In this example, it has a virtual path of ~/Content/Sites/magical/Index.aspx
.
I then created my own view engine as a test, which extends 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
);
}
}
The template looks like this:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Plain.Master" Inherits="System.Web.Mvc.ViewPage<MySoln.Client.Presentation.MyPresenter>" %>
...
<%: Model.SomePresenterSpecificMember %>
If I leave the strongly-typed declaration in the Inherits
attribute of the Page
declaration, I get the following exception:
Parser Error Message: Could not load type 'System.Web.Mvc.ViewPage<MySoln.Client.Presentation.MyPresenter>'.
However, if I change the template to use a weakly-typed page model, and instead use a cast on the Model member in the template itself, it works:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Plain.Master" Inherits="System.Web.Mvc.ViewPage" %>
...
<% var omg = (MySoln.Client.Presentation.MyPresenter) Model; %>
<%: omg.SomePresenterSpecificMember %>
So, my question is, why does the former barf and the latter work? I'd rather not cast Model to one of my presenter types in a tag at the top of every template.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
只需确保您的自定义视图引擎路径的根目录下有以下 web.config 文件:
您可以复制粘贴由默认模板自动生成并位于
~/views/web 中的 web.config 文件。 config
到~/content/web.config
中。基本上重要的部分是:
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, ..."
Just make sure that you have the following web.config file at the root of your custom view engine path:
You could copy-paste the web.config file automatically generated by the default template and located in
~/views/web.config
into~/content/web.config
.Basically the important part is :
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, ..."