Как поместить шаблон ASPX со строгим типизированным представлением в нестандартное место в ASP.NET MVC2? - PullRequest
1 голос
/ 17 сентября 2010

Итак, я лично думаю, что это что-то вроде удара.

Я поместил шаблон .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 к одному из моих типов презентаторов в теге вверху каждого шаблона.

Спасибо!

1 Ответ

1 голос
/ 17 сентября 2010

Просто убедитесь, что у вас есть следующий файл web.config в корне пути вашего пользовательского механизма просмотра:

<?xml version="1.0"?>

<configuration>
  <system.web>
    <httpHandlers>
      <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
    </httpHandlers>

    <!--
        Enabling request validation in view pages would cause validation to occur
        after the input has already been processed by the controller. By default
        MVC performs request validation before a controller processes the input.
        To change this behavior apply the ValidateInputAttribute to a
        controller or action.
    -->
    <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />

    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>
</configuration>

Вы можете скопировать и вставить файл web.config, автоматически созданный шаблоном по умолчаниюи находится в ~/views/web.config в ~/content/web.config.

В основном важная часть:

pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, ..."

...