Почему этот унаследованный вид не отображается? - PullRequest
1 голос
/ 28 мая 2009

Я попробовал следующее:

У меня есть общая библиотека (.dll), которая содержит эти файлы:

  • Просмотров
    • Поиск
      • PowerSearch.aspx
      • PowerSearch.aspx.cs
      • PowerSearch.aspx.designer.cs

Файл PowerSearch.aspx содержит мой HTML-код. Файл PowerSearch.aspx.cs содержит следующее:

using System.Web.Mvc;
using CommonProject.Web.Shared.Controllers;

namespace CommonProject.Web.Shared.Views.Search
{
    public partial class PowerSearch : ViewPage<SearchViewData>{}
}

А дизайнера, которого я обычно даже не волную, потому что он все равно не используется.

Ничего особенного, просто строго типизированное представление.
Я в основном вытащил существующее рабочее представление из моего проекта mvc asp.net, поместил его в отдельную библиотеку и изменил пространство имен, чтобы оно содержало слово «Shared», как в «это будет использоваться несколькими проектами mvc».

Тогда в моем исходном проекте asp.net mvc я создал ту же структуру, только теперь страница aspx не содержит ничего, кроме правила asp @Page.

Соответствующий файл cs содержит:

using System.Web.Mvc;
using CommonProject.Web.Shared.Controllers;

namespace CommonProject.Web.DRE.Views.Search
{
    public partial class PowerSearch : CommonProject.Web.Shared.Views.Search.PowerSearch { }
}

Также нет ошибок компиляции и исключений времени выполнения. Есть только огромная пустая страница ...

Кто-нибудь получил идею?

Ответы [ 3 ]

0 голосов
/ 28 мая 2009

Насколько сложно было добавить страницу ASPX в библиотеку классов ?! Его нет в списке по умолчанию при выборе «Добавить новый элемент ...».

Я знаю, что можно хранить контроллеры и модели в отдельной библиотеке DLL / сборке библиотеки, но я уверен, что хранить или делиться представлениями не так просто. Проблема заключается в том, что механизм просмотра по умолчанию ищет в определенной папке на диске представление (~ / Views / Controller / ViewName.as [pc] x или ~ / Views / Shared / ViewName.as [pc] x). С библиотекой DLL компилятор не имеет представления о том, что он может делать с вашим файлом ASPX. Это не код, поэтому, если у вас нет набора «Build Action», он просто игнорирует его. Существуют различные «встроенные действия», но я думаю, что ваши единственные варианты - «Копировать» и «Вставить как ресурс». Копировать не будет копировать в нужную вам папку (папку Views в вашем веб-проекте ASP.NET MVC), хотя вы могли бы написать сценарий сборки или 'Custom Tool' , который это сделал это для вас (с небольшим количеством работы).

Известность Hammett (из Castle Monorail) (а теперь и сотрудника MS) вышла с образцом, который позволяет хранить представления внутри сборок библиотеки, используя собственный класс VirtualPathProvider, который может копаться в DLL и извлекать представление ( встроен как ресурс). Пример приложения в данный момент является просто концепцией, поэтому вы можете столкнуться с некоторыми препятствиями, но, похоже, это работает и выглядит как захватывающее направление. Вы можете найти его в своем блоге здесь: MEF и ASP.NET MVC sample . Загрузите код и изучите его.

Это сообщение в блоге Плагины ASP.NET MVC написано не тем же автором, что и приведенный выше, но оно дает еще один обзор темы и указывает на еще одно сообщение здесь, в StackOverflow, где задавался аналогичный вопрос. : Использование VirtualPathProvider для загрузки представлений ASP.NET MVC из DLL .

Я видел сообщение от Фила Хаааааааааааааааак о хранении представлений в базе данных. Он использует сценарии Ruby вместо веб-форм, поэтому я не уверен на 100%, можете ли вы адаптировать его образец под свои нужды или нет. Проверьте это здесь: Сценарии представлений ASP.NET MVC, хранящихся в базе данных .

0 голосов
/ 28 мая 2009

Как выглядит исходный код для файла .aspx? Убедитесь, что вы наследуете свой вид в директиве страницы следующим образом:

<%@ Page Title="" Inherits="CommonProject.Web.Shared.Views.Search.PowerSearch" %&>

Также, если вы не хотите указывать все пространство имен в вашей директиве страницы, вы можете добавить это в раздел в вашем web.config:

<add namespace="CommonProject.Web.Shared.Views.Search"/>
0 голосов
/ 28 мая 2009

Убедитесь, что сборка (dll) находится в папке bin, на которую вы ссылаетесь. Также попробуйте добавить пространство имен сборки в файл web.config, иначе ваш View не сможет найти унаследованную страницу.

<pages>
      <namespaces>
        <add namespace="CommonProject.Web.Shared"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...