【问题标题】:Referencing internal class in MVC View在 MVC 视图中引用内部类
【发布时间】:2011-07-29 08:53:55
【问题描述】:

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

编辑:请不要提出替代方法,这不是我要的。

谢谢!

【问题讨论】:

    标签: c# internals


    【解决方案1】:

    那是 ASPX 视图引擎,对吧? AFAIK 它会生成一些代码并将其动态编译为临时 Asp.Net 文件夹中的一些随机命名的程序集。所以,这意味着您对 InternalsVisibleTo 属性不走运。

    如果你预编译你的视图,你可能会有一些运气,例如Compile Views in ASP.NET MVCCan I precompile my ASP.NET MVC application?

    【讨论】:

    • 是的,只需用反射器穿过内脏并点击GenerateRandomAssemblyName,所以你是对的。预编译可能是唯一的方法。将对其进行调查并报告。欢呼
    • 不认为这也行得通,因为它在内部使用相同的编译器,只是不在运行时,如果不重写视图编译器可能是不可能的:(
    【解决方案2】:

    视图应该使用 ViewModel。你为什么要制作一些额外的忍者级别的技巧来渲染简单的视图:)?定义视图模型

    public class FooViewModel
    {
         public string Foo {get;set;}
    }
    

    在控制器中

    public ActionResult FooAction
    {
         FooViewModel model = new FooViewModel()
         {
              Foo = InternalClass.Foo
         };
    
         return View(model);
    }
    

    【讨论】:

    • 为了简单起见,我发布的代码只是一个类比
    【解决方案3】:

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

    [assembly: InternalsVisibleTo("ActiveDirectory")]
    

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

    注意!不要忘记记录您对 Umbraco 源代码所做的所有更改,这样当有新版本时您可以将所做的更改带入。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多