2016-03-16 3 views
2

Возможно, это вопрос для программистов - я уверен, что кто-то посоветует мне, если так.Как хелпер-хелпер доступен для всех просмотров в MVC?

При использовании MVC я также могу получить доступ к переменной Html Helper и использовать любые методы расширения, либо .Net, либо те, которые я мог указать себе.

@Html.Raw("<h1>This is my HTML</h1>") 

Как это достигается? Скажем, я хотел добавить отдельный объект по другой причине и предоставить его для всех представлений в моем приложении MVC?

Я знаю, что я не могу добавить его в контроллер, так как один вид может быть доступен несколькими контроллерами.

Итак, моя лучшая догадка нуждается в подклассе IView?

Редактировать: извините - я сам не объяснил. По крайней мере, я думаю ...

Я хочу, чтобы объект был доступен, но также был создан. Так, например, говорят, что у меня был объект, называемый glosrob, с помощью метода SayHello() и хотел, чтобы иметь возможность использовать его таким образом:

@glosrob.SayHello() 

По существу я хочу, чтобы избежать необходимости добавить код для создания объекта на каждом представлении, например, избегайте этого

@{ 
    var glosrob = new Glosrob(); 
} 
+0

Как это @ Html.Raw, доступный в chtml –

ответ

2

Как Html помощник 'доступен' для всех представлений в MVC?

Внутри вашей папки просмотра вы найдете отдельный файл web.config. В конфигурационном файле будет класс, что все виды происходят из:

<pages pageBaseType="System.Web.Mvc.WebViewPage"> 

Таким образом, все виды происходят из WebViewPage класса, который содержит свойство Html, который обнажает HtmlHelper.

Скажем, я хотел добавить отдельный объект по другой причине и предоставить его доступным ко всем представлениям в моем приложении MVC?

Если вы хотите, чтобы ваша собственная собственная экспозиция подвергалась воздействию, вы должны прочитать на Changing Base Type Of A Razor View.

Сначала вы создаете свой собственный класс с вашим собственным имуществом:

public abstract class CustomWebViewPage : WebViewPage { 
    public Glosrob Glosrob { get; set; } 

    public override void InitHelpers() { 
    base.InitHelpers(); 
    Glosrob = new Glosrob(); 
    } 
} 

и обновить конфигурации:

<pages pageBaseType="MyProject.Web.CustomWebViewPage"> 

Тогда вы можете вызвать его на ваш взгляд:

@Glosrob.SomeMethod(); 
+0

Perfect - спасибо. – glosrob

1

В вашей папке видов вы найдете отдельный файл web.config. В этом файле вы можете объявить пространства имен, которые необходимо импортировать. В разделе вы ищете это:

<system.web.webPages.razor> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
      <add namespace="System.Web.Mvc" /> 
      <add namespace="System.Web.Mvc.Ajax" /> 
      <add namespace="System.Web.Mvc.Html" /> 
      <add namespace="System.Web.Routing" /> 
     </namespaces> 
    </pages> 
</system.web.webPages.razor> 

Если вы хотите импортировать свои собственные объекты, вы можете добавить любое пространство имен в этом разделе, и она будет доступна в вашей Бритве просмотров

EDIT: В Если вам нужен конкретный экземпляр для каждого представления, вам необходимо предоставить свою собственную реализацию представления. Вы можете сделать это путем наследования от WebViewPage:

public class MyViewPage : WebViewPage 
{ 
    // implement property here 
} 

public class MyViewPage<TModel> : WebViewPage<TModel> 
{ 
    // implement property here 
} 

Обратите внимание, что вам нужно, чтобы обеспечить реализацию общего и необщего версии. После этого вы должны убедиться, что View Engine использует это как базовую страницу. В разделе упоминалось выше, вы бы сделать следующее:

<system.web.webPages.razor> 
    <pages pageBaseType="<the.name.space>.MyViewPage"> 
    ... 
    </pages> 
</system.web.webPages.razor> 

В случае, если вы можете сделать с общим объектом, вы можете определить его в статическом классе и сделать этот класс доступен с использованием описанного выше метода.

+0

Спасибо - это имеет смысл. Однако я думаю, что мой вопрос не совсем передал мое намерение. Можете ли вы проверить мое редактирование? – glosrob

+0

Это близко к вопросу. –

1

У вас есть несколько вариантов. Вы можете поместить свой Html класс Helper в пространстве имен System.Web.Mvc как

namespace System.Web.Mvc 
{ 
    public static class HtmlExtensions 
    { 

Можно также импортировать пространство имен на каждой странице:

<%@ Import Namespace="MvcApplication1.Helpers" %> 

Или вы можете зарегистрироваться в сети.конфиг

<namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="MyHelper"/> 

    </namespaces> 

Также проверьте это как возможный дубликат: Import Namespace for Razor View

+0

Спасибо - это имеет смысл. Однако я думаю, что мой вопрос не совсем передал мое намерение. Можете ли вы проверить мое редактирование? – glosrob

+0

Это не отвечает на вопрос. –

+0

Спасибо, редактирование намного яснее. @ErikPhilips прав, поскольку это отвечало другой интерпретации вашего первоначального вопроса. –

Смежные вопросы