Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Виды в отдельных сборках в ASP.NET MVC
Я пытаюсь создать веб-приложение, в котором я хочу иметь возможность подключать отдельные сборки. Я использую MVC preview 4 в сочетании с Unity для внедрения зависимостей, которые я использую для создания контроллеров из моих сборок плагинов. Я использую WebForms (default aspx) в качестве движка представления.
Если я хочу использовать представление, я застрял на тех, которые определены в основном проекте, из-за динамической компиляции части ASPX. Я ищу правильный способ вложить файлы ASPX в другой assembly, не проходя через весь шаг deployment. Неужели я упускаю что-то очевидное? Или мне следует прибегнуть к программному созданию своих представлений?
Update: я изменил принятый ответ. Несмотря на то, что ответ Дейла очень скрупулезен, я пошел за решением с другим поставщиком виртуальных путей. Он работает как заклинание и занимает всего около 20 строк кода, я думаю.
Мне потребовалось слишком много времени, чтобы заставить это работать должным образом из различных частичных примеров, поэтому вот полный код, необходимый для получения представлений из папки представлений в общей библиотеке, структурированной так же, как обычная папка представлений, но со всем набором для сборки в качестве встроенных ресурсов. Он будет использовать встроенный файл только в том случае, если обычный файл не существует.
Первая строка Application_Start:
HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedViewPathProvider());
В VirtualPathProvider
public class EmbeddedVirtualFile : VirtualFile
{
public EmbeddedVirtualFile(string virtualPath)
: base(virtualPath)
{
}
internal static string GetResourceName(string virtualPath)
{
if (!virtualPath.Contains("/Views/"))
{
return null;
}
var resourcename = virtualPath
.Substring(virtualPath.IndexOf("Views/"))
.Replace("Views/", "OrangeGuava.Common.Views.")
.Replace("/", ".");
return resourcename;
}
public override Stream Open()
{
Assembly assembly = Assembly.GetExecutingAssembly();
var resourcename = GetResourceName(this.VirtualPath);
return assembly.GetManifestResourceStream(resourcename);
}
}
public class EmbeddedViewPathProvider : VirtualPathProvider
{
private bool ResourceFileExists(string virtualPath)
{
Assembly assembly = Assembly.GetExecutingAssembly();
var resourcename = EmbeddedVirtualFile.GetResourceName(virtualPath);
var result = resourcename != null && assembly.GetManifestResourceNames().Contains(resourcename);
return result;
}
public override bool FileExists(string virtualPath)
{
return base.FileExists(virtualPath) || ResourceFileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath)
{
if (!base.FileExists(virtualPath))
{
return new EmbeddedVirtualFile(virtualPath);
}
else
{
return base.GetFile(virtualPath);
}
}
}
Последний шаг, чтобы заставить его работать, заключается в том, что корневой Web.Config должен содержать правильные настройки для разбора строго типизированных представлений MVC, так как тот, который находится в папке views, не будет использоваться:
<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>
Чтобы заставить его работать с Mono, требуется несколько дополнительных шагов. Во-первых, вам нужно реализовать GetDirectory, так как все файлы в папке views загружаются при запуске приложения, а не по мере необходимости:
public override VirtualDirectory GetDirectory(string virtualDir)
{
Log.LogInfo("GetDirectory - " + virtualDir);
var b = base.GetDirectory(virtualDir);
return new EmbeddedVirtualDirectory(virtualDir, b);
}
public class EmbeddedVirtualDirectory : VirtualDirectory
{
private VirtualDirectory FileDir { get; set; }
public EmbeddedVirtualDirectory(string virtualPath, VirtualDirectory filedir)
: base(virtualPath)
{
FileDir = filedir;
}
public override System.Collections.IEnumerable Children
{
get { return FileDir.Children; }
}
public override System.Collections.IEnumerable Directories
{
get { return FileDir.Directories; }
}
public override System.Collections.IEnumerable Files
{
get {
if (!VirtualPath.Contains("/Views/") || VirtualPath.EndsWith("/Views/"))
{
return FileDir.Files;
}
var fl = new List<VirtualFile>();
foreach (VirtualFile f in FileDir.Files)
{
fl.Add(f);
}
var resourcename = VirtualPath.Substring(VirtualPath.IndexOf("Views/"))
.Replace("Views/", "OrangeGuava.Common.Views.")
.Replace("/", ".");
Assembly assembly = Assembly.GetExecutingAssembly();
var rfl = assembly.GetManifestResourceNames()
.Where(s => s.StartsWith(resourcename))
.Select(s => VirtualPath + s.Replace(resourcename, ""))
.Select(s => new EmbeddedVirtualFile(s));
fl.AddRange(rfl);
return fl;
}
}
}
Наконец, строго типизированные представления будут почти, но не совсем работать идеально. Модель будет рассматриваться как нетипизированный объект, поэтому, чтобы получить сильную обратную типизацию, вам нужно начать свои общие представления с чего-то вроде
<% var Model2 = Model as IEnumerable<AppModel>; %>
По сути, это та же проблема, что и у людей с WebForms и попытками скомпилировать свои файлы UserControl ASCX в DLL. Я нашел этот http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx , который может сработать и для вас.
protected void Application_Start()
{
WebFormViewEngine engine = new WebFormViewEngine();
engine.ViewLocationFormats = new[] { "~/bin/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" };
engine.PartialViewLocationFormats = engine.ViewLocationFormats;
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(engine);
RegisterRoutes(RouteTable.Routes);
}
protected void Application_Start()
{
WebFormViewEngine engine = new WebFormViewEngine();
engine.ViewLocationFormats = new[] { "~/bin/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" };
engine.PartialViewLocationFormats = engine.ViewLocationFormats;
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(engine);
RegisterRoutes(RouteTable.Routes);
}
Установите свойство 'Copy to output' вашего представления на 'Copy always'
Дополнение ко всем вам, кто все еще ищет священный grail: я немного приблизился к его поиску, если вы не слишком привязаны к webforms viewengine.
Я недавно опробовал Spark viewengine. Кроме того, что он совершенно потрясающий, и я бы не вернулся к webforms, даже если бы я был threathened, он также предоставляет некоторые очень хорошие крючки для модульности приложения. Пример в их документах - использование Windsor в качестве контейнера IoC, но я не могу представить, что это будет намного сложнее, если вы хотите использовать другой подход.