从未引用的程序集动态加载预编译的视图会给主MVC应用程序带来错误的错误(不能识别模型类型)

时间:2018-02-18 22:05:36

标签: c# razor model-view-controller plugins .net-assembly

大家好,这可能很难:

我目前正在为我的MVC网站制作插件,并且我会执行以下操作:

  1. 创建主MVC应用
  2. 创建一个插件MVC应用程序,并将其构建为带有预编译视图的.dll文件(剃刀生成器)
  3. 将插件.dll程序集文件提取到主应用程序
  4. 使用MEF动态创建一个插件控制器,调用预编译的视图。
  5. 使用RazorGenerator MVC引擎映射路由并查找.dll中的视图并加载它们
  6. 未参考插件MVC应用程序的预编译视图显示在屏幕上。
  7. 问题是,对于没有模型的视图,它可以100%正常工作,但每当我将模型附加到模型时,主应用程序似乎无法识别模型的命名空间/类< / strong>并抛出异常:

      

    System.InvalidOperationException:传递给的模型项   字典的类型为&#39; PluginTest.Models.ProductModel&#39;,但是这个   字典需要类型的模型项   &#39; PluginTest.Models.ProductModel&#39;

    完全例外:

      

    System.InvalidOperationException:传递给的模型项   字典的类型为&#39; PluginTest.Models.ProductModel&#39;,但是这个   字典需要类型的模型项   &#39; PluginTest.Models.ProductModel&#39 ;.在   System.Web.Mvc.ViewDataDictionary 1.SetModel(Object value) at System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) at System.Web.Mvc.WebViewPage 1.SetViewData(的ViewDataDictionary   viewData)at   System.Web.Mvc.WebViewPage.set_ViewData(ViewDataDictionary value)at   RazorGenerator.Mvc.PrecompiledMvc​​View.Render(ViewContext viewContext,   TextWriter编写者)   C:\用户\ ACertainUser \桌面\ ACertainFolder \ RazorGenerator \ RazorGenerator.Mvc \ PrecompiledMvc​​View.cs:行   81.在System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext   上下文)   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext   controllerContext,ActionResult actionResult)at   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList的1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1   filters,Int32 filterIndex,ResultExecutingContext preContext,   ControllerContext controllerContext,ActionResult actionResult)at   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList 1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1个过滤器,ActionResult actionResult)at   System.Web.Mvc.Async.AsyncControllerActionInvoker&LT;&GT; c__DisplayClass21&LT;&GT; c__DisplayClass2b.b__1c()   在   System.Web.Mvc.Async.AsyncControllerActionInvoker&LT;&GT; c__DisplayClass21.b__1e(IAsyncResult的   asyncResult)at   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End()   在   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult的   asyncResult)at   System.Web.Mvc.Controller.b__1d(IAsyncResult的   asyncResult,ExecuteCoreState innerState)at   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End()   在System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)   在System.Web.Mvc.Controller.b__15(IAsyncResult   asyncResult,Controller controller)at   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End()   在System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)at at   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult的   asyncResult)at   System.Web.Mvc.MvcHandler.b__5(IAsyncResult的   asyncResult,ProcessRequestState innerState)at   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase 1.End()   在System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult   asyncResult)at   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult的   结果)在   System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep步骤)at   System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp;   completedSynchronously)

    此错误通常意味着控制器没有将正确的模型发送到视图,但在这种情况下,我认为主应用程序不知道此类型是什么。

    它发生在代码的这一部分(来自RazorGenerator.Mvc):

    public void Render(ViewContext viewContext, TextWriter writer)
            {
                WebViewPage webViewPage = _viewPageActivator.Create(viewContext.Controller.ControllerContext, _type) as WebViewPage;
    
                if (webViewPage == null)
                {
                    throw new InvalidOperationException("Invalid view type");
                }
    
                if (!String.IsNullOrEmpty(_masterPath))
                {
                    _overriddenLayoutSetter.Value(webViewPage, _masterPath);
                }
    
                webViewPage.VirtualPath = _virtualPath;
                webViewPage.ViewContext = viewContext;
    
                webViewPage.ViewData = new ViewDataDictionary(viewContext.ViewData); // IT CRASHES HERE
                webViewPage.InitHelpers();
    
                WebPageRenderingBase startPage = null;
    
                if (this.RunViewStartPages)
                {
                    startPage = StartPage.GetStartPage(webViewPage, "_ViewStart", ViewStartFileExtensions);
                }
    
                var pageContext = new WebPageContext(viewContext.HttpContext, webViewPage, null);
                webViewPage.ExecutePageHierarchy(pageContext, writer, startPage);
            }
    

    此外,当我调试此方法并查看viewContext参数时,我看到存在正确的模型数据(仅包含3个字段:id,name,cost)。这意味着ViewContext中的Model是合法的,实例化的,并且在其中具有正确的数据。它似乎不喜欢被转移到webViewPage.ViewData字典。请记住,我正在调试主应用程序,但我可以看到来自不同程序集的类。

    http://prntscr.com/igksd1

    我有什么方法可以解决这个问题,所以我可以从一个未引用的汇编中获得工作模型吗?

    非常感谢!

    编辑:反思可能解决这个问题吗?如何从另一个程序集导入一个类型,以便在尝试复制字典数据时WebViewPage对象可以看到它?

0 个答案:

没有答案