Мы разрабатываем 3 приложения asp mvc, для этого потребуется один и тот же общий редактор &. Вместо того, чтобы копировать/вставлять их во все 3 проекта, возможно ли каким-то образом разместить их в общем компоненте и как-то ссылаться на них во всех приложениях?Есть ли способ повторно использовать шаблоны редактора и отображения в приложениях asp mvc?
ответ
Вам нужно будет создать свой собственный ViewEngine
, если хотите сделать вид из места, отличного от папок Views.
public class CustomViewEngine : WebFormViewEngine {
public CustomViewEngine() : base() {
MasterLocationFormats = new[] {
"/YourFolder/{1}/{0}.master",
"/YourFolder/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"/YourFolder/{1}/{0}.aspx",
"/YourFolder/{1}/{0}.ascx",
"/YourFolder/Shared/{0}.aspx",
"/YourFolder/Shared/{0}.ascx"
};
PartialViewLocationFormats = ViewLocationFormats;
}
//Override the FindView method to implement your own logic
public override ViewEngineResult FindView(
ControllerContext controllerContext, string viewName,
string masterName, bool useCache)
return base.FindView(controllerContext, viewName, masterName, useCache);
}
}
Затем зарегистрировать ваш ViewEngine
в Global.asax
:
protected void Application_Start() {
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());
}
Кроме того, this post может быть полезным. (слишком плохо, что ссылка на ссылку внизу сломана)
Редактировать: Похоже, что это решение не будет работать на практике, поскольку ASP.NET не позволит загружать контент из-за пределов каталога приложения (см. Eilon).
Но ссылка выше, сохраняющая представления в БД, все еще может быть полезна.
Для совместного использования пользовательских элементов управления (или почти любое содержание) между несколькими приложениями ASP.NET вы можете использовать трюк, перечисленные здесь: http://aspadvice.com/blogs/ssmith/archive/2006/10/05/Tip_3A00_-Share-User-Controls-Between-Applications-in-ASP.NET.aspx
Основная идея состоит в том, чтобы поместить файлы ASCX в папку и сделать эту папку в виртуальную папку других приложений (вы можете иметь несколько виртуальных папок, указывающих на одну и ту же физическую папку).
Я не уверен, как это можно сделать, но должен быть способ скомпилировать страницы в DLL и обмениваться библиотекой.
Но если вы можете позволить себе использовать собственный двигатель просмотра и другую систему шаблонов (например StringTemplate), то вы можете поделиться мнениями, как если вы используете библиотеку:
- Создать проект библиотеки классов
- Создайте свои шаблоны как обычно и отметьте их как «Встроенный ресурс». Это позволит убедиться, что они будут помещены в библиотеку DLL
- Напишите свой собственный механизм просмотра, чтобы вытащить шаблоны из сборки (DLL). Хороший старт может быть редактирование/разветвление существующего: http://code.google.com/p/string-template-view-engine-mvc/source/browse/trunk/StringTemplateViewEngine/StringTemplateViewEngine.cs
- Затем зарегистрировать свой вид двигателя в проекте ASP.NET MVC
Это не решает проблему под рукой. Он по-прежнему не будет загружать пользовательские элементы управления из других приложений (или из любой папки вне приложения). – Eilon
@Eilon, разве вы не имеете в виду общие представления пользовательских элементов управления? –
Я имею в виду, что ваше решение просто позволяет вам размещать элементы управления пользователя в других файлах в * том же * приложении. Первоначальный вопрос задал вопрос о возможности использования * несколькими * приложениями одинаковых пользовательских элементов управления. – Eilon