2015-09-07 41 views
2

我想嵌入视图在一个外部的DLL随着他们的CSS和JS。我主要在那里。我从我的主项目中做了一个Html.RenderPartial,并且似乎找到了嵌入式视图,并且css和js没有问题(使用VirtualPathProvider)。MVC嵌入式视图

然而,嵌入式视图然后调用一个动作(在外部DLL),它返回一个PartialView(也嵌入)。该视图被发现(并且我已经在顶部放置了@inherits System.Web.Mvc.WebViewPage语句以避免关于'在上下文中找不到模型'的错误)。

但是最后一个障碍似乎是关于“... WebViewPage不包含'DisplayFor'.....”的定义,因为我使用@ Html.DisplayFor(.....

任何人都可以告诉我,我需要做什么才能解决这个问题的最后一点?我已经从Views文件夹中将web.config复制到我的dll所在的bin文件夹中(好像是由其他文章实现的)但是这并没有帮助。

非常感谢

PS当视图的生成操作设置复制到输出目录和我使用的视图引擎来指向bin/views目录它一切正常。这是唯一的,现在我已经改变了嵌入式的ressource

回答

2

@ Html.DisplayFor(...)是一个扩展方法具有以下签名:

public static MvcHtmlString DisplayFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression, 
    string templateName 
) 

它位于System.Web.Mvc.Html( System.Web.Mvc.dll)需要被引用,以便视图编译正确。你怎么会引用这是另外一个问题,但你可能有它在渲染直通默认VPP其他视图,或者你可以执行以下操作:如果你想

  • 确保其可用以尝试诊断它在运行时未加载的原因,您可能希望预编译您的视图。只需以下添加到您的项目文件:

    <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
        <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
    </Target> 
    

这将显示你可以在编译时他们构建而不是运行时的任何错误在你的看法。

  • 但是,如果您仍然无法在运行时引用程序集,那么您可能需要将其与BuildManager.AddReferencedAssembly一起添加。在这里,我不打算复制/粘贴上述链接的内容,您可以阅读并阅读其他信息。 但是,请注意,通过在另一个视图中使用助手来引用它可能是更安全的解决方案,因为如果它已经被引用,上述方法会注意到这一事实并报告错误。
+0

该库已在项目中引用。事实上,外部DLL是一个完整的Mvc网站项目 - 可能不必要,但它是确保所有剃须刀语法都具有智能感知等的快速方法。所以它在那里,但显然我错过了将嵌入资源字符串转换为一个编译的视图。我是否需要设置自定义工具属性?我是否需要安装剃须刀发电机加载项?该条目已经存在于我的项目文件 – user2047485

+0

不,您不会错过“诀窍”。它就在那里,您的VirtualPathProvider负责确保当Razor选择编译视图时视图可用。你需要确保它编译。有一个很难的方法:在ASP.NET Temporary文件夹中调查视图的输出。或者,为了使事情变得更简单,请在您的网络中添加(或类似)。配置,然后挖掘它。不是很令人兴奋,但有帮助。 –

+0

它不会抱怨@ Html.Raw只有Html.DisplayFor。我拿出了DisplayFors但是离开了Raw并且工作正常。我的VirtualPathProvider应该不仅仅是用GetManifestResourceStream(resourceName)返回新的EmbeddedVirtualFile(virtualpath,stream)吗?我需要在那里做点什么吗? – user2047485