2015-09-07 4 views
2

Я пытаюсь встроить представления во внешнюю dll вместе с css и js для них. Я в основном там. Я делаю Html.RenderPartial из моего основного проекта и, кажется, находит встроенный просмотр и css и js без проблем (используя VirtualPathProvider).MVC embedded views

Однако этот встроенный вид вызывает действие (во внешней dll), которое возвращает PartialView (также встроенный). Представление найдено (и я поставил оператор @inherits System.Web.Mvc.WebViewPage вверху, чтобы избежать ошибок в отношении «модели, не найденной в контексте»).

Однако последнее препятствие, кажется, ошибка о «... WebViewPage не содержит определение для„Displayfor“.....», потому что я использую @ Html.DisplayFor (.....

Может ли кто-нибудь сказать мне, что мне нужно сделать для этого финального фрагмента головоломки? Я скопировал файл web.config из папки «Views» в папку bin, в которой находятся мои dll (как будто это было связано с другими сообщениями) но это не помогло.

спасибо очень много

PS Когда действие сборки для представлений был установлен Copy To Output Directory, и я использовал ViewEngine для указывают на каталог bin/views, все работает нормально. Это только теперь, когда я изменил Внедренный Ressource

ответ

2

@ Html.DisplayFor (...) представляет собой метод расширения со следующей подписью:

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression, 
    string templateName 
) 

Он находится в System.Web.Mvc.Html (System.Web.Mvc.dll), на которые нужно ссылаться, чтобы представление правильно компилировалось. Как вы бы ссылаться на это другой вопрос, но вы можете иметь его в других представлениях, оказываемых через VPP по умолчанию, или вы можете сделать следующее:

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

    <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
        <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
    </Target> 
    

Это позволит выявить возможные ошибки, которые могут возникнуть в ваших взглядах компиляцией их на сборке, а затем время выполнения.

  • Если вы все еще не можете ссылаться на сборку во время выполнения, вам может потребоваться добавить ее с помощью BuildManager.AddReferencedAssembly. Здесь я не собираюсь копировать/вставлять содержимое вышеуказанной ссылки, вы можете прочитать ее и прочитать дополнительную информацию. Остерегайтесь, однако, ссылаясь на это с помощью помощника в другом представлении, может быть более безопасным решением, поскольку, если он уже упоминается, вышеупомянутый метод замечает этот факт и сообщает об ошибке.
+0

Эта библиотека уже упоминается в проекте. Фактически внешняя dll представляет собой полный проект веб-сайта Mvc - возможно, излишне, но это был быстрый способ обеспечить, чтобы весь синтаксис бритвы имел intellisense и т. Д. Таким образом, он есть, но, очевидно, мне не хватает трюка с преобразованием встроенной строки ресурса в скомпилированное представление. Нужно ли устанавливать свойство Custom Tool? Нужно ли устанавливать надстройку генератора Razor? Эта запись уже существует в моем файле проекта – user2047485

+0

Нет, вы не пропустите «трюк». Это все, ваш VirtualPathProvider несет ответственность за то, что представление доступно, когда Razor решает его скомпилировать. Вы должны убедиться, что он компилируется. Трудно сделать это: исследовать вывод ваших представлений в папке «Временная папка ASP.NET». Или, чтобы сделать вещи немного проще, добавьте (или аналогичный) в свой Интернет.config, а затем выкопайте его. Не очень интересно, но помогает. –

+0

Он не жалуется на @ Html.Raw только Html.DisplayFor. Я вынул DisplayFors, но оставил Raw, и это работает нормально. Должен ли мой VirtualPathProvider делать больше, чем возвращать новый EmbeddedVirtualFile (virtualpath, stream) потоком только GetManifestResourceStream (resourceName)? Нужно ли мне что-то делать с ним? – user2047485