MVC: представление, найденное в ' ~/.../Index.cshtml ' не был создан

Я создал модульный проект MVC для загрузки другого специального веб-проекта в той же среде выполнения.

другие проекты находятся в папке в корне сайта и называется "модули". Я использую атрибут PreApplicationStartMethod для загрузки других сборок внутри подкаталогов при загрузке.

Я добавил специальные маршруты для каждого модуля с ограничениями пространства имен.

Я создал класс, который реализует RazorViewEngine переопределить viewPath при вызове элемента в модуле: ~ / Views / Home / Index.cshtml - > ~ / модули / ModuleTest/просмотры/Главная / индекс.cshtml по.

на Index () метод внутри динамически загруженной библиотеки успешно вызывается, но я получил ошибку при отображении представления:

см. следующее изображение:http://i.imgur.com/KoTgxg2.png

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

ошибка сервера в приложении"/".

вид, найденный в ' ~ / Modules/ModuleTest/Views/Home / Index.cshtml ' не был создан.

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

Сведения Об Исключении: System.InvalidOperationException: представление, найденное в ' ~ / Modules/ModuleTest/Views/Home / Index.cshtml ' не был создан.

  • исключение
Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 

[InvalidOperationException: The view found at '~/Modules/ModuleTest/Views/Home/Index.cshtml' was not created.]
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +362
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +431
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +39
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +116
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +529
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +106
   System.Web.Mvc.Async.c__DisplayClass28.b__19() +321
   System.Web.Mvc.Async.c__DisplayClass1e.b__1b(IAsyncResult asyncResult) +185
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40
   System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44
   System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult, Controller controller) +39
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.MvcHandler.b__4(IAsyncResult asyncResult, ProcessRequestState innerState) +39
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9514812
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18408

    2 ответов


    Я нашел проблему, отладив в http://aspnetwebstack.codeplex.com/.

    Я фактически загружаю библиотеку, содержащую контроллеры из другой папки, чем bin в my ModulesContainer класса (см. вопрос). Но внутри!--7--система>.Сеть.В MVC.dll файлы, один метод пытается найти мой тип контроллера, выполнив сборка.Load () в папку по умолчанию, его почему BuildManager.GetCompiledType () вернуться null.

    Я нашел простой способ, чтобы переопределить этот метод с :

    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainAssemblyResolve;

    и

    private static Assembly CurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.RequestingAssembly != null)
                return args.RequestingAssembly;
            Module module = _modules.SingleOrDefault(x => x.Assembly.FullName == args.Name);
            if (module != null)
                return module.Assembly;
            throw new Exception(string.Format("Unable to load assembly {0}", args.Name));
        }

    Я просто смотрю внутрь моего встроенные dll кэш, чтобы найти уже загруженную сборку.


    @Lex2193: я нашел проблему в вашем ответе. Когда я использовал ваш код, он работал хорошо, за исключением ситуации, когда ссылочная сборка имеет другую ссылку, от которой она зависит:

    Module [M] => Dependency [D] => DeepDependency [DD]
    

    когда вы используете в объекте модуля из [D], который имеет в нем некоторые вызовы к чему-то в [DD]. Он потерпит неудачу в исключении TypeLoad. Из-за запроса на сборку. Поэтому я отредактировал код для первого поиска модуля:

    public static Assembly CurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)
    {
        Assembly module = modules.SingleOrDefault(x => x.FullName == args.Name);
        if (module != null)
            return module;
    
        if (args.RequestingAssembly != null)
            return args.RequestingAssembly;
    
        throw new Exception(string.Format("Could not load file or assembly {0}", args.Name));
    }