所以,基本上我想要做的事情是:
@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),但这很酷:)
答案 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
或覆盖Controller
和WebViewPage
并保存/读取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博文,了解其他类似方法。