MVC 嵌入式视图
MVC embedded views
我正在尝试将视图与 css 和 js 一起嵌入到外部 dll 中。我大部分时间都在那里。我从我的主项目中做了一个 Html.RenderPartial,它似乎找到了嵌入式视图,css 和 js 没问题(使用 VirtualPathProvider)。
然而,该嵌入式视图然后调用一个操作(在外部 dll 中),其中 returns 一个 PartialView(也是嵌入式的)。找到了视图(并且我在顶部放置了一个@inherits System.Web.Mvc.WebViewPage 语句以避免关于 'model not found in context' 的错误)。
然而,最后一个障碍似乎是关于“...WebViewPage 不包含 'DisplayFor'..... 的定义”的错误,因为我正在使用 @Html.DisplayFor(.. ...
任何人都可以告诉我我需要做什么才能完成拼图的最后一点吗?我已将 web.config 从 Views 文件夹复制到我的 dll 所在的 bin 文件夹中(其他帖子似乎暗示了这一点),但这没有帮助。
非常感谢
PS 当视图的构建操作设置为“复制到输出目录”并且我使用 ViewEngine 指向 bin/views 目录时,一切正常。现在才改成Embedded Ressource
@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 添加它。上面link的内容我就不copy/paste了,大家可以看看,也可以看看补充信息。
但是请注意,通过在另一个视图中使用助手来引用它可能是更安全的解决方案,因为如果它已经被引用,上述方法会注意到这一事实并报告错误。
我正在尝试将视图与 css 和 js 一起嵌入到外部 dll 中。我大部分时间都在那里。我从我的主项目中做了一个 Html.RenderPartial,它似乎找到了嵌入式视图,css 和 js 没问题(使用 VirtualPathProvider)。
然而,该嵌入式视图然后调用一个操作(在外部 dll 中),其中 returns 一个 PartialView(也是嵌入式的)。找到了视图(并且我在顶部放置了一个@inherits System.Web.Mvc.WebViewPage 语句以避免关于 'model not found in context' 的错误)。
然而,最后一个障碍似乎是关于“...WebViewPage 不包含 'DisplayFor'..... 的定义”的错误,因为我正在使用 @Html.DisplayFor(.. ...
任何人都可以告诉我我需要做什么才能完成拼图的最后一点吗?我已将 web.config 从 Views 文件夹复制到我的 dll 所在的 bin 文件夹中(其他帖子似乎暗示了这一点),但这没有帮助。
非常感谢
PS 当视图的构建操作设置为“复制到输出目录”并且我使用 ViewEngine 指向 bin/views 目录时,一切正常。现在才改成Embedded Ressource
@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 添加它。上面link的内容我就不copy/paste了,大家可以看看,也可以看看补充信息。 但是请注意,通过在另一个视图中使用助手来引用它可能是更安全的解决方案,因为如果它已经被引用,上述方法会注意到这一事实并报告错误。