2011-03-23 38 views
0

所以,基本上想什麼,我是做這樣的事情:傳遞一個可選的對象各方意見

@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和剃刀),但它會很酷:)

回答

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

查看/ 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> 

或者讓測試項目here

更新2: 結賬this博客文章的另一種方式做類似的事情。

+0

我看到使用viewbag的簡單的東西的吸引力。更復雜的東西雖然吸引了我,但是你能否對這些重寫做一些闡述? – Dynde 2011-03-23 09:50:15

+1

更新了我的文章:)它基本上只是環繞ViewData/ViewBag,因爲在控制器中你不知道是否有視圖。請注意,它不一定是字符串,例如,您可以輕鬆地用複雜對象替換它。 – 2011-03-23 10:40:47

+0

非常感謝:) – Dynde 2011-03-23 10:59:28

7

你可以寫一個自定義的全球行動,過濾器,將注入該所有視圖的信息。例如:

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

,然後在你的Global.asaxRegisterGlobalFilters方法註冊該過濾器:

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 
} 
+0

awsom man awsome! – 2011-03-23 09:47:44

+0

這不是我正在尋找的,因爲這意味着通知將始終發送到視圖包。我想指定何時,何地以及在什麼條件下在控制器操作中執行此操作:) – Dynde 2011-03-23 09:48:17

+0

@Dynde,我不明白。在你的問題中,你說過你正在尋找一種方法來傳遞所有視圖的信息,現在你談談控制器操作中的條件。如果您想在控制器操作中執行此操作,只需將此代碼放入您的視圖模型中並將其填充到控制器操作中即可。 – 2011-03-23 09:50:55

相關問題