如果我从MVC视图中引用internal
类,AssemblyBuilder
会抱怨它无法访问该类(这有意义):
System.Web.Compilation.AssemblyBuilder.Compile()
我尝试添加InternalsVisibleTo
属性:
System
System.Web
System.Core
但我无法让它发挥作用。这有可能吗?
演示:
internal static class InternalClass
{
public static string Foo = "bar";
}
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<%: InternalClass.Foo %>
堆栈追踪:
Compiler Error Message: CS0122: 'InternalClass' is inaccessible due to its protection level
at System.Web.Compilation.AssemblyBuilder.Compile()
at System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp)
编辑:请不要建议其他方法,这不是我要求的。
谢谢!
答案 0 :(得分:2)
视图应该使用ViewModels。你为什么要做一些额外的忍者级别技巧来渲染简单的视图:)?定义视图模型
public class FooViewModel
{
public string Foo {get;set;}
}
并在控制器中
public ActionResult FooAction
{
FooViewModel model = new FooViewModel()
{
Foo = InternalClass.Foo
};
return View(model);
}
答案 1 :(得分:2)
这是ASPX视图引擎,对吗? AFAIK它会生成一些代码并将其动态编译为Temporary Asp.Net Files文件夹中的一些随机命名的程序集。所以,这意味着你对InternalsVisibleTo属性不满意。
如果你预先编辑你的观点,你可能会有一些运气,例如Compile Views in ASP.NET MVC或Can I precompile my ASP.NET MVC application?
答案 2 :(得分:0)
我还需要Umbraco Assemblies的内部课程,并提出了这个解决方案。将此语句放在要使用内部类的AssemblyInfo.cs中:
[assembly: InternalsVisibleTo("ActiveDirectory")]
将ActiveDirectory
替换为您自己的程序集。我想使用Umbraco.Core程序集中的内部类,所以我把这个语句放在Umbraco.Core的AssemblyInfo.cs中,它就像一个魅力。
请注意!不要忘记记录您对Umbraco源代码所做的所有更改,因此当有新版本时,您可以引入您所做的更改。