2013-06-11 65 views
3
任何頁面

上顯示的消息一般的方法我有我的ASP.NET MVC Web應用程序相當簡單的(解釋)要求:

在任何頁面,能夠顯示基於一個消息事件發生在前一頁上。消息可以包括動態內容,例如用戶在表單提交中輸入的信息。

這種類似...

Yes, success!

該方法必須POST-REDIRECT-GET情況下工作。

如果用戶在應用程序上有兩個打開的瀏覽器選項卡(共享會話狀態),則任何消息只應顯示在相關事件發生的選項卡中。

例如:

  • 提交反饋形式,消息感謝用戶(通過名稱)

  • 在登錄時,一個消息,當他們最後告訴用戶的日期/時間之後登錄到應用

我首先想到的是使用強類型的視圖以適當的模型(具有string屬性)。但是,這意味着要改變每個現有的非強類型視圖以使用此模型,並更新所有現有模型以從此新模型繼承。

這似乎是矯枉過正。

一種替代方法是在消息存儲在TempData

// In my controller 
TempData["Message"] = "Some kind of message"; 

// In my shared master view 
@if (TempData["Message"] != null) 
{ 
    <div class="message">@TempData["Message"]</div> 
} 

使用TempData被覆蓋在更詳細一點在this blog posting。有趣的是,作者還建議使用自定義HTTP頭作爲替代。一個有趣的想法,但does not work with POST-REDIRECT-GET

正在使用TempData的首選選項,還是有更好的選擇? (例如更強類型的東西)

回答

2

我的第一個想法是爲此使用強類型視圖和適當的模型(帶有字符串屬性)。但是,這意味着要改變每個現有的非強類型視圖以使用此模型,並更新所有現有模型以從此新模型繼承。

這是唯一一致的,可重複使用的,可測試的解決方案,可以做到這一點,我可以想象,儘管它可能會造成額外的工作。

+0

如何將這項工作一個POST重定向消息得到什麼? –

+0

@RichardEv你說得對,我想我錯過了這個要求。所以實際上你只是在尋找一種「帶副作用的GET」? – CodeCaster

+0

(在這種情況下,它是[提交後重定向獲取(PRG)摘要頁]的副本(http://stackoverflow.com/questions/9775684/post-redirect-get-prg-summary-page-on提交)等)。 – CodeCaster

0

您可以在您的項目中制定一個約定,顯示的消息總是會進入ViewBag.InfoMessage動態變量。所以,在佈局文件中,如果它從控制器傳遞到視圖中,則會顯示它。

更嚴格的方法是創建一個基礎模型類InfoMessage財產,並從數據庫中獲取所有其他型號/的ViewModels。

要堅持通過POST-REDIRECT-GET場景下的消息,使用哪個你會清除一次值發送到視圖一個會話變量 - 避免顯示在多頁。

這裏是一些代碼:

public class BaseViewModel 
{ 
    public string InfoMessage { get; set; } 
} 
public class SpecificViewModel : BaseViewModel 
{ 
    // other model properties 
} 

在你的控制器則:

SpecificViewModel vm = new SpecificViewModel(); 

vm.InfoMessage = Session["InfoMessage"] as string; 
Session["InfoMessage"] = null; 

// other code 

return View(vm); 

當然你的觀點將有強類型的模型:SpecificViewModel

+0

代碼示例很棒。我只是在一個POST-REDIRECT-GET場景中嘗試了這一點,並且'ViewBag'數據並沒有持續超過重定向。 –

+0

對不起,我有些遺漏了您的問題中POST-REDIRECT-GET的要求。爲此,最好使用會話變量來保持頁面之間的消息。然後,您將以描述的方式使用該值:在「ViewBag」或基本模型類中。我會發布一些代碼並更新答案。 – Floremin

1

最好的做法是使用ViewModelsViewControllers之間進行通信。你可以有一個基地View Model和下面的所有其他View Models derived from that

public class BaseVM 
    { 
     public string Message{ get; set;} 
    } 

    public class CreateViewModel: BaseVM 
    { 
     public string CustoomerName{ get; set;} 
    } 

可以填充Message財產而模型如下返回到控制器:

public ActionResult Step2() 
{ 
    //Some Logic 

    step2Model.Message = "Yes, Success..!!"; 

    return View(step2Model); 
} 

之後,每個視圖頁面上,您可以檢查是否該酒店有東西在it.You可以這樣做如下:

@if(!string.IsNullOrEmpty(Model.Message)) 
{ 
    //Show message 
} 

編輯:

OP深知這種做法的,但仍保持這個答案,因爲它有一個片段來說明如何在代碼中做到這一點。其次,在使用ViewModels時,我同意CodeCaster在他的回答中提出的評論。

這是我可以想象的唯一一致的,可重用的,可測試的解決方案,儘管可能會導致額外的工作。