2012-05-31 3 views
4

Я создаю это приложение MVC3 Razor ASP.NET, в котором я использую пользовательский WebViewPage, который наследует от этого. Так что все мои взгляды использовать мои пользовательские WebViewPage:Есть ли способ получить доступ к пользовательскому помощнику с контроллера?

public class MyCustomWebViewPage : System.Web.Mvc.WebViewPage 
{ 
    public CustomHelper MyHelper { get; private set; } 
     : 
} 

, а затем в web.config, расположенный в папке Views я указал, что MyCustomViewPage моя базовая страница по умолчанию.

<system.web.webPages.razor> 
    <pages pageBaseType="Namespace.MyCustomWebViewPage"> 
     <namespaces> 
      : 
     </namespaces> 
    </pages> 
</system.web.webPages.razor> 

До сих пор так хорошо, наПредставление в .cshtml страниц, которые я могу получить доступ к пользовательскому помощнику из бритвы разметки:

@MyHelper.SomeMethod() 

Теперь, есть что-то, что нужно сделать условно на помощнике. Я попытался установить свойство хелпера в разделе @ {} запуска CSHTML, но слишком поздно, чтобы его принять во внимание.

Итак, я собираюсь сделать это либо по вызываемому методу Action, либо переопределить метод OnActionExecuting().

У меня есть проблема в том, что в контроллере я не нашел способ, чтобы получить доступ к моему пользовательскому помощнику, таким как:

public class AnyController : Controller { 
    public ActionResult Index() { 
     MyHelper.SomeProperty = true; 
    } 
} 

Чтобы объяснить это немного больше, концепция является то, что в действии (код действия в контроллере). Я хочу установить свойство в пользовательском помощнике, чтобы включить определенные функции. Таким образом, это не отображается на представлениях, которые ему не нужны. Он отличается от концепции @section, в которой контент определен в представлении, а скорее говорит: «Я хочу, чтобы эта функция была добавлена ​​в макет», и макет выдал некоторую предопределенную разметку, которая позволила бы этой функции И, что в нескольких местах в представлении могут быть «самородки», которые требуют «разметки или скрипта поддержки функций». Если я использую раздел, то этот «общий» сценарий будет появляться несколько раз, и это не то, что мне нужно.

Сказав это, как я могу получить доступ к (пользовательскому) помощнику, определенному на странице базового представления, изнутри контроллера?

ответ

2

Рассмотрите возможность передачи информации с помощью модели, поскольку она больше соответствует MVC. Вы можете использовать сильно типизированную модель или слабо типизированный ViewBag (образец - Passing data from controller to view).

Контролер не должен знать, какая именно страница будет использоваться для визуализации. Он просто говорит что-то «найти представление с этим именем и отобразить эти данные (модель)». В зависимости от разных условий могут быть разные представления, соответствующие одному и тому же имени, поэтому обычно у вас нет способа установить свойства объекта вида из контроллера.

Edit: Почему это технически очень сложно:

Lifetime метода действия вызова (ActionResult Index(){...}) не пересекается с жизнью страница (объект WebViewPage). Объект WebViewPage, созданный после завершения действия. Поэтому, если вы действительно заинтересованы в том, чтобы передавать данные из действия непосредственно в объект вида (а не через встроенные механизмы), вам нужно будет выяснить, как передать часть кода (вероятно, в форме делегата) для просмотра кода создания.

+0

Информация, которую я пытаюсь получить, полностью не зависит от модели. Как я указал, это помощник, который позволяет мне делать определенные вещи. Например, некоторые вспомогательные методы Google AdSense, которые я могу или не хочу использовать в представлении. По этой причине я хочу иметь доступ к пользовательской веб-странице, чтобы сообщить, что-то делать или нет. Это также не функциональность раздела. –

+0

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

+0

Эх, я не хочу выталкивать вещи после визуализации представления. Я хочу, @ Alexei-levenkov перед визуализируемым представлением, установить атрибут/свойство, чтобы макет макета представления отображал некоторые данные (включая общий скрипт). После этого мне ничего не нужно обновлять, представление отображается так, как я хочу. –

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