2014-01-07 7 views
0

Вопрос «https://stackoverflow.com/questions/16397785/add-pages-to-mvc-deployed-website», похоже, тесно связан с вопросом, который я хочу задать. Но это мой случай, я еще не разработал приложение, но хочу его развить таким образом, чтобы его можно было настроить пользователями после его развертывания путем добавления файлов в развернутый каталог. Каким будет целесообразный способ сделать это? В частности, я хочу, чтобы пользователи могли определять пользовательские страницы, возможно, заменять существующие страницы или добавлять элементы управления к существующим страницам и, возможно, определять пользовательские функции WebAPI для извлечения пользовательских данных. Я попытался добавить файлы .vbhtml в каталог представлений, как описано, но столкнулся с той же проблемой, описанной в связанном вопросе.Развертывание не скомпилированного приложения ASP.NET MVC Razor

ответ

0

Если основной целью является обеспечение расширяемости, то есть более простой ответ. ASP.Net проведет проверку всех сборок в каталоге bin развернутого веб-приложения и заберет все контроллеры и модели в собранных сборках там, а также все некомпилированные представления в каталоге представлений. С некоторыми усилиями я смог определить минимальный набор файлов, необходимых для создания независимого проекта шаблонов, который мог бы использоваться людьми, которые разработали и разворачивали специальный код в запущенное (развернутое) веб-приложение.Детали предоставлены в качестве ответа на более релевантный вопрос, который я обнаружил по этой теме, потому что не просто получить Intellisense и другие ASP.Net MVC4 приложения этого проекта шаблона. См. https://stackoverflow.com/a/21122377/78162

Поскольку Visual Studio Express теперь доступен бесплатно, я надеюсь, что такой проект шаблона может быть загружен в качестве отправной точки для разработки настроек в другом приложении ASP.Net MVC4. Мое ограниченное тестирование показывает, что это будет работать как для слоя пользовательского интерфейса (как показано в предыдущей ссылке), так и для уровней API (как обсуждалось в https://stackoverflow.com/a/21028825/78162).

0

Я не думаю, что рекомендовал бы использовать файловую систему для этого. Я думаю, вы должны сохранить код бритву в базу данных, а затем, когда вы хотите, чтобы разобрать его, вы можете сделать это в соответствии с этим Using RazorEngine to parse Razor templates concurrently

Вот другой пример:

var model = new { Name = "Test" }; 
var template = "Hello @Model.Name"; 

var result = Razor.Parse(template, model); 

Код взят из Using Razor engine on strings - not views

Редактировать, чтобы ответить на ваши вопросы:

бритва код будет храниться в базе данных вместе с каким-либо контроллером вы хотели, чтобы запустить его. Когда вы извлекаете код бритвы из базы данных, вы также должны знать контроллер, затем вы можете перенаправить на этот контроллер, отправив любую модель, которую вы хотите, в код бритвы, а затем проанализируйте ее, как показано выше. Имеют смысл?

+0

Означает ли это, что можно настроить? Например, разрешено ли настраивать пользовательские представления, а не настраиваемые контроллеры или модели? Позволяет ли это настраивать существующие представления и не разрешать создание новых представлений? Неясно, как интегрируются контроллеры, модели и представления в этой схеме, я смущен тем, куда будет идти этот код. В контроллере? В представлении? – BlueMonkMN

+0

Недостаточно информации, чтобы предположить, что вы должны или не должны использовать файловую систему для хранения представлений. Можно легко использовать VirtualPathProvider и хранить представления в базе данных вместо файловой системы. Реальный вопрос заключается в том, каким образом BlueMonkMN хочет, чтобы пользователи могли редактировать их после развертывания. Предполагая, что каждая установка является сайтом одного пользователя, пользователь будет иметь доступ к файловой системе и может изменять виды. Имейте в виду, что изменение представлений не изменяет поведение приложения, поскольку все это содержится в действиях контроллера. –

+0

См. Мое редактирование. Не использовать файловую систему - это личное предпочтение, основанное на моем опыте. – user1477388

0

Представления Razor скомпилированы во время выполнения, поэтому вы всегда разворачиваете их без компиляции.

Что вы хотите - это просто страницы Razor, поэтому можете добавить их в любую директорию (не Views) и получить к ним доступ без расширения файла (например,/Foo/Bar вместо /Foo/Bar.vbhtml).

+0

Но для того, чтобы получить доступ к представлению, вам, видимо, нужно будет скомпилировать контроллер перед ним. Или я чего-то не хватает? – BlueMonkMN

+0

Страницы бритвы не нужны контроллеры, как '.aspx'. См. Http://www.asp.net/web-pages –

+0

Чтобы визуализировать Razor View, вам нужен Контроллер/Действие для ответа на запрос inboud HTTP. Вы можете создать модифицированную версию механизма просмотра Razor, которая могла бы искать настраиваемые действия контроллера в плагиновой архитектуре, но это очень много работы по созданию, но может быть сделано. –

0

Конфигурация маршрутизации может быть настроена для идентификации шаблона URL-адреса, который идентифицирует все запросы для настроенного кода и маршрутизирует их через общий контроллер, который затем может загружать произвольные представления на основе информации, указанной в URL-адресе. Обратите внимание на маршрут с именем Custom ниже и как он всегда использует действие Index контроллера с именем Custom, но вводит новый параметр customization.

Public Class RouteConfig 
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

     routes.MapRoute(_ 
     name:="Custom", _ 
     url:="custom/{customization}/{id}", _ 
     defaults:=New With {.controller = "Custom", .action = "Index", .id = UrlParameter.Optional} _ 
    ) 

     routes.MapRoute(_ 
      name:="Default", _ 
      url:="{controller}/{action}/{id}", _ 
      defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ 
     ) 
    End Sub 
End Class 

После этого настройки, добавить контроллер под названием CustomController к проекту, который просто проходит через к виду определяется customization параметра:

Public Class CustomController 
    Inherits System.Web.Mvc.Controller 

    ' 
    ' GET: /Custom 

    Function Index(customization As String) As ActionResult 
     Return View(customization) 
    End Function 

End Class 

Publish этот код и добавить каталог Custom под каталог Views в развернутом расположении. Теперь вы можете поместить любой файл .vbhtml в папку Custom и обратиться к нему с URL-адресом, например http://localhost/MyApplication/Custom/MyView, который загрузит MyView.vbhtml из каталога Views\Custom.

+0

Единственное, что делает это решение, это позволить вам передать имя представления для предопределенного действия контроллера и заставить его вернуть это представление. Вам не хватает возможности настраивать поведение действия контроллера, а также модель, которая передается в представление. Если ВСЕ вам нужны пользовательские представления, почему бы не реализовать VirtualPathProvider, сохраните настроенные представления в базе данных и не понадобится этот «пользовательский» контроллер? –

+0

Он также позволяет мне добавлять код в функцию индекса, чтобы вызывать собственный код, на основе которого выполняется настройка. Это также позволяет мне определять пользовательские контроллеры, как только я выясню, что нужно делать контроллеру, кроме того, чтобы выбрать вид (который может быть ничем). Таким образом, я могу объединить все настройки в одном месте, но разрешить произвольное число произвольно названных настроек. Этот пользовательский контроллер кажется более простым, чем реализация VirtualPathProvider, а также предоставляет возможность вызывать собственный код контроллера, на основе которого выполняется настройка. – BlueMonkMN

Смежные вопросы