Итак, я лично думаю, что это что-то вроде удара.
Я поместил шаблон .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
);
}
}
Шаблон выглядит так:
<code>
<%@ 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 '.
Однако, если я изменю шаблон на использование модели страницы со слабым типом и вместо этого использую приведение к члену модели в самом шаблоне, это будет работать:
<code>
<%@ 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 к одному из моих типов презентаторов в теге вверху каждого шаблона.
Спасибо!