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

C# 将可选对象传递给所有视图,c#,asp.net,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Razor,所以,基本上我想做的是: @if(Notification!=null){ //perform javascript notification with @Notification.Text } 我希望能够在任何视图上执行此操作,因此我始终可以选择在控制器操作中指定通知对象,如果已定义,则可以在视图中处理该对象 我的理想场景是通过以某种方式创建通知对象,然后返回视图来实现这一点。也就是说,我不需要显式地将通知对象传递给模型。像这样: public ActionResult MyAc

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

@if(Notification!=null){
     //perform javascript notification with @Notification.Text
 }
我希望能够在任何视图上执行此操作,因此我始终可以选择在控制器操作中指定通知对象,如果已定义,则可以在视图中处理该对象

我的理想场景是通过以某种方式创建通知对象,然后返回视图来实现这一点。也就是说,我不需要显式地将通知对象传递给模型。像这样:

public ActionResult MyAction(){
    Notification n = new Notification("Text for javascript");
    return View();
}
我在想,也许有一种方法可以通过一些ViewPage继承来实现这一点?但我真的不知道该怎么做

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


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

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

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.Controller.ViewBag.Notification = new Notification("Text for javascript");                 
    }
}
然后在
Global.asax的
RegisterGlobalFilters
方法中注册此筛选器:

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
}

将ViewBag用于弹出消息等简单内容

public ActionResult Index()
{
    ViewBag.PopupMessage = "Hello!";
    return View();
}
然后在视图(或布局页面)中

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>
公共类HomeController:BaseController
{
公共行动结果索引()
{
通知=“来自索引的您好!”;
返回视图();
}
}
通知:@(通知??“(空)”)
或者获取测试项目

更新2:
查看博客文章,了解另一种类似的方法。

这并不是我想要的,因为这意味着通知将始终发送到viewbag。我想在控制器操作中指定何时何地以及在什么条件下执行此操作:)@Dynde,我不明白。在您的问题中,您说您正在寻找一种在所有视图上传递此信息的方法,现在您讨论控制器操作中的条件。如果您想在控制器操作中执行此操作,那么只需将此代码放在视图模型中,并在控制器操作中填充它。实际上,我说的是“…任何视图…”并不是每个视图,“…因此我将始终拥有此选项…”。我不使用ViewModel的原因是因为我认为这种需求(我使用通知只是作为一个例子)比ViewModel更为通用——这意味着在所讨论的视图上下文中或多或少更为具体。我看到了使用viewbag处理简单内容的吸引力。更复杂的东西让我很感兴趣,你能详细说明一下覆盖吗?更新了我的帖子:)它基本上只是围绕ViewData/ViewBag展开,因为在controller中,你不知道是否会有视图。请注意,它不必是字符串,例如,您可以轻松地用复杂对象替换它。我使用自定义通知对象实现了您的解决方案。在视图中,没有@Notification intellisense,它试图让我指定类“Notification”-虽然它工作得很好,但我能做些什么来让视图intellisense配合吗?:)你试过把它关掉再打开吗?(说真的,intellisense有时会忽略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>