Ссылка на внутренний класс в MVC View - PullRequest
3 голосов
/ 29 июля 2011

Если я ссылаюсь на класс internal из представления MVC, 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 ]

2 голосов
/ 29 июля 2011

Это движок ASPX view, верно? AFAIK он генерирует некоторый код и динамически компилирует его в какую-то произвольно названную сборку в папке Temporary Asp.Net Files. Итак, это означает, что вам не повезло с атрибутом InternalsVisibleTo.

Вам может повезти, если вы предварительно скомпилируете свои взгляды, например, Компиляция представлений в ASP.NET MVC или Можно ли предварительно скомпилировать мое приложение ASP.NET MVC?

2 голосов
/ 29 июля 2011

Представления должны использовать ViewModels. Зачем вам делать дополнительные трюки уровня ниндзя, чтобы сделать простой вид :)? Определить модель вида

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

и в контроллере

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

     return View(model);
}
0 голосов
/ 31 января 2017

Мне также были нужны внутренние классы от Umbraco Assemblies, и я предложил это решение.Поместите этот оператор в AssemblyInfo.cs, из которого вы хотите использовать внутренние классы:

[assembly: InternalsVisibleTo("ActiveDirectory")]

Замените ActiveDirectory вашей собственной сборкой.Я хотел использовать внутренние классы из сборки Umbraco.Core, поэтому я поместил этот оператор в AssemblyInfo.cs из Umbraco.Core, и он работает как шарм.

Примечание!Не забудьте записать все изменения, которые вы внесли в исходный код Umbraco, чтобы при появлении новой версии вы могли внести эти изменения.

...