在MVC视图中引用内部类

时间:2011-07-29 08:53:55

标签: c# internals

如果我从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)

编辑:请不要建议其他方法,这不是我要求的。

谢谢!

3 个答案:

答案 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 MVCCan I precompile my ASP.NET MVC application?

答案 2 :(得分:0)

我还需要Umbraco Assemblies的内部课程,并提出了这个解决方案。将此语句放在要使用内部类的AssemblyInfo.cs中:

[assembly: InternalsVisibleTo("ActiveDirectory")]

ActiveDirectory替换为您自己的程序集。我想使用Umbraco.Core程序集中的内部类,所以我把这个语句放在Umbraco.Core的AssemblyInfo.cs中,它就像一个魅力。

请注意!不要忘记记录您对Umbraco源代码所做的所有更改,因此当有新版本时,您可以引入您所做的更改。