Передача необязательного объекта во все представления - PullRequest
0 голосов
/ 23 марта 2011

Итак, в основном я хотел бы сделать что-то вроде:

@if(Notification!=null){
     //perform javascript notification with @Notification.Text
 }

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

Мой сценарий мечты - разрешить это, просто создав объект Notification каким-либо образом, а затем просто вернув представление.То есть мне не нужно явно передавать объект Notification в модель.Вот так:

public ActionResult MyAction(){
    Notification n = new Notification("Text for javascript");
    return View();
}

Я думаю, что может быть способ сделать это с некоторым наследованием ViewPage?Но я действительно не уверен, как поступить с этим?

В идеальном мире мне также хотелось бы иметь возможность "переопределить", что делать.Например, если я в своем «верхнем» макете предпочитаю выполнять определенный вид jquery-уведомлений, если объект уведомления существует, но, возможно, в каком-то другом вложенном представлении хотел бы обработать его по-другому, я бы хотел переопределить параметробработка топ-макетов объекта.

Я знаю, что эта последняя вещь может быть немного утопичной (я только начинаю с MVC и Razor), но это было бы круто:)

Ответы [ 2 ]

7 голосов
/ 23 марта 2011

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

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.Controller.ViewBag.Notification = new Notification("Text for javascript");                 
    }
}

и затем зарегистрируйте этот фильтр в методе RegisterGlobalFilters вашего Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new MyActionFilterAttribute());
}

А потом в ваших взглядах:

@if(ViewBag.Notification != null) 
{
     //perform javascript notification with @ViewBag.Notification.Text
}
2 голосов
/ 23 марта 2011

Используйте ViewBag для простых вещей, таких как всплывающее сообщение.

public ActionResult Index()
{
    ViewBag.PopupMessage = "Hello!";
    return View();
}

и затем в представлении (или странице макета)

@if (ViewBag.PopupMessage != null)
{
    <div class="popup">@ViewBag.PopupMessage</div>
}

Для более сложных вещей вам нужно будет либо создать статическийКласс и сохранить / читать из HttpContext.Current.Items или переопределить Controller и WebViewPage и сохранить / читать из ViewBag / ViewData.

Обновление:

public abstract class BaseController : Controller
{
    public const string NotificationKey = "_notification";

    protected string Notification
    {
        get
        {
            return ViewData[NotificationKey] as string;
        }
        set
        {
            ViewData[NotificationKey] = value;
        }
    }
}

public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
    protected string Notification
    {
        get
        {
            return ViewData[BaseController.NotificationKey] as string;
        }
    }
}

Views / Web.config

<pages pageBaseType="OverrideTest.Framework.BaseViewPage">

Использование:

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        Notification = "Hello from index!";

        return View();
    }
}

<div>Notification: @(Notification ?? "(null)")</div>

Или получить тестовый проект здесь

Обновление2: Проверьте это сообщение в блоге для другого способа сделать что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...