将可选对象传递给所有视图

时间:2011-03-23 09:32:51

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor

所以,基本上我想要做的事情是:

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

我希望能够在任何视图上执行此操作,因此我始终可以选择在我的控制器操作中指定通知对象,如果已定义,则可以在视图中处理。

我的梦想场景是仅通过以某种方式创建Notification对象来允许此操作,然后只返回视图。意思是,我不需要将Notification对象显式传递给模型。像这样:

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

我在想,有些方法可以通过一些ViewPage继承来实现这一点吗?但我真的不确定如何解决这个问题?

在一个理想的世界里,我也希望能够“超越”做什么。例如,如果我在'top'-layout中选择执行某种jquery通知,如果通知对象存在,但可能在某些其他嵌套视图中想要以不同方式处理它,我想要覆盖的选项顶层布局处理对象。

我知道这最后一件事可能有点乌托邦(我刚刚开始使用MVC和Razor),但这很酷:)

2 个答案:

答案 0 :(得分:7)

您可以编写一个自定义全局操作过滤器,它将在所有视图上注入此信息。例如:

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

然后在RegisterGlobalFilters的{​​{1}}方法中注册此过滤器:

Global.asax

然后在你的观点中:

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

答案 1 :(得分:2)

将ViewBag用于弹出消息之类的简单内容。

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

然后在视图(或布局页面)

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

对于更复杂的内容,您需要创建静态类并保存/读取HttpContext.Current.Items或覆盖ControllerWebViewPage并保存/读取ViewBag / { {1}}。

<强>更新

ViewData

查看/ Web.config中

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;
        }
    }
}

用法:

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

或者获得测试项目here

更新2: 查看this博文,了解其他类似方法。