2010-04-05 59 views
0

我有一個獨特的場景,我希望基礎控制器可以獲取一些數據並將其存儲在列表中。這個列表應該可以像ViewData一樣從我的視圖中訪問。我將在每個頁面上使用這個列表,並希望得到一個更清晰的解決方案,而不僅僅是將它放在ViewDataDictionary中。ASP.NET MVC從控制器傳遞信息,無需ViewData,ViewModel或Session

試圖想出一個解決方案後,我想我會創建一個自定義ViewPage與屬性來保存我的列表。我的自定義ViewPage將從System.Web.MVC.ViewPage繼承。但是,我不知道MVC將視圖數據從控制器傳遞到視圖的位置。更重要的是,我如何才能將我的列表傳遞給視圖?

感謝您的幫助。

編輯....

對不起。我試圖儘可能簡化問題以避免混淆。顯然,這沒有工作:)

我在.net mvc項目中實現我自己的會話管理。當請求進入時,我的基礎控制器會檢查會話cookie是否與OnActionExecuting方法中的請求一起發送。如果發送了會話cookie,我的控制器就會訪問數據庫並檢索用戶的會話信息。會話信息(用戶標識等)被放入List對象並存儲在名爲「Sess」的屬性中。

我希望能夠從我的意見訪問的SESS列表中的元素是這樣的:

那麼,如何以及在哪裏讓我的控制器,隨手關SESS列表我的意見?

我意識到這不是通常在.net中實現自定義會話管理的方式。但是,這將是我的項目最簡單,最乾淨的解決方案。

感謝迄今爲止幫助過的所有人!

+1

這是RenderAction可能更適合這項工作的場景之一。如果有需要在每個頁面上呈現的數據(如菜單),RenderAction使這更容易。這基本上只是一個簡單的方法來貫穿整個生命週期,因此您可以分享您的應用程序中的零食部分(菜單,廣告,小部件) – Jab 2010-04-05 15:34:49

+0

我同意Jab,如果需要一些動態數據,請使用RenderAction如果你只想渲染一個ASCX(如果你願意的話,你也可以選擇提供一個Model到RenderPartial) – mare 2010-04-05 17:44:25

回答

0

爲什麼你不想使用ViewData?僅僅是因爲你不想在每一個將ViewDataDictionary中的數據放入一些數據的行爲中都有一行代碼?

您可以使用動作過濾器,並將該數據的每個動作執行之前,例如像

public class AddSomeDataToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //filterContext.Controller.ViewData.Add("SomeConstant")(data); 
    } 
} 

然後,你只要把這個屬性在每個控制器或在基本控制器。

編輯: 你可以做一些擴展方法,如

public static void Add<T>(this IDictionary<string, object> dictionary, T anObject) 
{ 
    var key = typeof(T).Name; 
    dictionary.Add(key, anObject); 
} 

public static T Get<T>(this IDictionary<string, object> dictionary) 
{ 
    var key = typeof(T).Name; 
    return (T)dictionary[key]; 
} 

然後添加的數據是這樣的:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    //filterContext.Controller.ViewData.Add<YourListType>(data); 
} 

並在視圖,你得到的數據,如這個:

ViewData.Get<YourListType>(); 

問候。

+0

我不想將ViewData [「Session」]作爲列表時間在我的意見。 – josh 2010-04-05 19:59:42

+0

好的,我編輯了我的答案。 – uvita 2010-04-05 20:47:49

0

問題不清楚:要回答部分問題,可以在基本ViewModel上使用屬性。您需要在基礎ViewModel的構造函數中設置該屬性。您的實例對象需要顯式調用基本ViewModel的構造函數,如果任何值需要傳遞給它,無論它正在做什麼工作......此構造函數調用都是普通的C#,因此網上有很多示例。

我同意,如果這是菜單,RenderAction似乎是一個更簡單的方法來實現功能。我嘗試了菜單的基本ViewModel方法,然後切換到專門負責導航的控制器上使用RenderAction。

缺乏ASP.NET MVC站點的動態導航示例是令人驚訝的,因爲它看起來像這樣一個基本要求。

0

你必須更好地描述你的問題。

而且,除了動作過濾器或Controller.OnActionExecuted覆蓋,您可以使用Html.RenderAction

2

一般來說,我建議明確允許您的視圖允許訪問。因此,我建議您將這些數據放在您的控制器的ViewData中,然後從視圖中將其從ViewData中提取出來。這可以將控制器和視圖之間的通信線路保持在一個地方並且很簡單。

但是,如果您確實想從視圖訪問會話,您可以。

<%: ViewContext.HttpContext.Session["key"] %> 

有一兩件事你可以做的是有一個從System.Web.Mvc.ViewPage派生自己的自定義視圖頁面類和更改繼承的聲明在頁面的頂部指向您的視圖頁面。

<%@ Page ... Inherits="YourNamespace.YourViewPage" %> 

您的自定義視圖頁面可能具有任何您需要的屬性。