Подтвердить что ты не робот

Совместное использование контроллеров и представлений с несколькими веб-приложениями

Я хотел бы разбить свои контроллеры и представления на отдельные библиотеки классов, чтобы их можно было повторно использовать в нескольких приложениях ASP.NET MVC 3. Часть контроллеров не была проблемой при использовании отдельной сборки, однако получить механизм просмотра, чтобы найти представление было.

В итоге я использовал Скомпилировать ваши представления asp.net mvc Razor в отдельную dll.

Есть ли более простой способ, который я пропустил?

4b9b3361

Ответ 1

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

  • Поместите общие представления (.cshtml,.vbhtml files) в проект библиотеки. (У меня также есть несколько общих контроллеров в этом проекте.) Если вы хотите использовать _Layout.cshtml из своего приложения, убедитесь, что вы добавили _ViewStart.cshtml, который указывает на него, с вашими общедоступными представлениями.

  • В проекте библиотеки задайте все свойства свойств представления для встроенного ресурса.

  • В проект библиотеки добавьте следующий код, который будет записывать содержимое ваших представлений в каталог tmp/Views.

.

public class EmbeddedResourceViewEngine : RazorViewEngine
{
    public EmbeddedResourceViewEngine()
    {
        ViewLocationFormats = new[] {
        "~/Views/{1}/{0}.aspx",
        "~/Views/{1}/{0}.ascx",
        "~/Views/Shared/{0}.aspx",
        "~/Views/Shared/{0}.ascx",
        "~/Views/{1}/{0}.cshtml",
        "~/Views/{1}/{0}.vbhtml",
        "~/Views/Shared/{0}.cshtml",
        "~/Views/Shared/{0}.vbhtml",
        "~/tmp/Views/{0}.cshtml",
        "~/tmp/Views/{0}.vbhtml"
    };
        PartialViewLocationFormats = ViewLocationFormats;

        DumpOutViews();
    }

    private static void DumpOutViews()
    {
        IEnumerable<string> resources = typeof(EmbeddedResourceViewEngine).Assembly.GetManifestResourceNames().Where(name => name.EndsWith(".cshtml"));
        foreach (string res in resources) { DumpOutView(res); }
    }

    private static void DumpOutView(string res)
    {
        string rootPath = HttpContext.Current.Server.MapPath("~/tmp/Views/");
        if (!Directory.Exists(rootPath))
        {
            Directory.CreateDirectory(rootPath);
        }

        Stream resStream = typeof(EmbeddedResourceViewEngine).Assembly.GetManifestResourceStream(res);
        int lastSeparatorIdx = res.LastIndexOf('.');
        string extension = res.Substring(lastSeparatorIdx + 1);
        res = res.Substring(0, lastSeparatorIdx);
        lastSeparatorIdx = res.LastIndexOf('.');
        string fileName = res.Substring(lastSeparatorIdx + 1);

        Util.SaveStreamToFile(rootPath + fileName + "." + extension, resStream);
    }
}

Я использую Adrian StreamToFile writer, нашел здесь.

  • В приложении Global.asax.cs вашего приложения добавьте:

.

public static void RegisterCustomViewEngines(ViewEngineCollection viewEngines)
{
   //viewEngines.Clear(); //This seemed like a bad idea to me.
   viewEngines.Add(new EmbeddedResourceViewEngine());
}

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    RegisterCustomViewEngines(ViewEngines.Engines);
}

Ответ 3

Всего несколько дополнений к Карсон Херрик отличный пост...

  • Вам нужно будет решить несколько ссылок (вам нужно будет включить System.Runtime.Remoting в свой проект).

  • Utils.SaveStreamToFile необходимо изменить на →

    System.Runtime.Remoting.MetadataServices.MetaData.SaveStreamToFile(resStream, rootPath + fileName + "." + extension);
    
  • Вы можете получить ошибку. Вид должен быть получен из WebViewPage или WebViewPage<TModel>. Ответ здесь: Вид должен быть получен из WebViewPage или WebViewPage <TModel>

  • При развертывании проекта очень вероятно, что вы получите сообщение об ошибке при загрузке проекта. Вы должны предоставить APP POOL, который вы используете (полные) права на папку.