如何從非控制器類添加到TempData字典?從非控制器類添加到TempData
2
A
回答
3
你將不得不在TempDataDictionary傳遞給其他類。我這樣做很多,只要其他課程與表達有關(它聽起來像是這樣)就沒有問題。
0
要做到這一點,你需要當前的控制器上下文,否則你不能。
ViewContext.Controller.TempData [ 「不管」] =什麼
1
你做不是需要ControllerContext,你只需要目前的HttpContext。
而且你不需要傳遞任何東西,你可以創建一個新的SessionStateTempDataProvider並使用它,因爲這個類的SaveTempData方法唯一的作用是在當前會話的特定鍵上設置一個IDictionary。
(如果您的應用程序未使用任何自定義ITempDataProvider如果你這樣做,你顯然必須依賴於代替。)
的SessionStateTempDataProvider是一個非常簡單的類:
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Web.Mvc.Properties;
namespace System.Web.Mvc
{
public class SessionStateTempDataProvider : ITempDataProvider
{
internal const string TempDataSessionStateKey = "__ControllerTempData";
public virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
{
HttpSessionStateBase session = controllerContext.HttpContext.Session;
if (session != null)
{
Dictionary<string, object> tempDataDictionary = session[TempDataSessionStateKey] as Dictionary<string, object>;
if (tempDataDictionary != null)
{
// If we got it from Session, remove it so that no other request gets it
session.Remove(TempDataSessionStateKey);
return tempDataDictionary;
}
}
return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
}
public virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
HttpSessionStateBase session = controllerContext.HttpContext.Session;
bool isDirty = (values != null && values.Count > 0);
if (session == null)
{
if (isDirty)
{
throw new InvalidOperationException(MvcResources.SessionStateTempDataProvider_SessionStateDisabled);
}
}
else
{
if (isDirty)
{
session[TempDataSessionStateKey] = values;
}
else
{
// Since the default implementation of Remove() (from SessionStateItemCollection) dirties the
// collection, we shouldn't call it unless we really do need to remove the existing key.
if (session[TempDataSessionStateKey] != null)
{
session.Remove(TempDataSessionStateKey);
}
}
}
}
}
}
因此我們可以這樣做:
var httpContext = new HttpContextWrapper(HttpContext.Current);
var newValues = new Dictionary<string, object> {{"myKey", myValue}};
new SessionStateTempDataProvider().SaveTempData(new ControllerContext { HttpContext = httpContext }, newValues);
請注意,這是覆蓋現有的字典每t ime,所以如果你想順序添加數據,你顯然必須依賴一箇中間容器或者編寫一些額外的邏輯來將現有值與新值合併。
我的情況下,我需要這樣做是爲了錯誤頁面處理,在那裏我做重定向,但我需要有持久性臨時數據的邏輯超出控制器的範圍。
1
ControllerBase.TempData物業
System.Web.Mvc.TempDataDictionary
您可以使用公共TempDataDictionary TempData的 {獲得;組; }
使用TempData的
例如像TempData.Clear(); //清除其他類中的TempData
相關問題
- 1. TempData從視圖移動到控制器
- 2. 將類添加到使用TempData的@ Html.Raw幫助器中?
- 3. 在非控制器類
- 4. 告訴動作/控制器堅持TempData
- 5. Xcode 8,添加UIButtons到NavigationBar的非初始視圖控制器
- 6. asp.net mvc:從控制器動態添加子/子控制器
- 7. 從控制器傳遞非強類型參數到視圖
- 8. 從控制器內添加一條到控制器的新路線?
- 9. 添加值從其他控制器
- 10. 添加不應該從控制器
- 11. 添加視圖控制器到UICollectionViewCell
- 12. 添加自定義ViewLocator到控制器
- 13. 添加控制器到ListView模板
- 14. UrlMappings添加後綴到控制器
- 15. 添加參數到控制器
- 16. 添加路由到Rails 3控制器
- 17. AngularJS添加動作到控制器
- 18. cookies添加到控制器 - $ cookies
- 19. 離子2:如何添加從控制器類
- 20. 如何從非視圖控制器類啓動視圖控制器
- 21. 添加視圖控制器
- 22. 添加段控制器
- 23. 添加控制器參考/指針到c + +單例類
- 24. Swift將多個類添加到相同的視圖控制器
- 25. 添加變量從模型傳遞到控制器的對象
- 26. 從Rails控制器添加到整數變量
- 27. 從控制器的外部添加到角模型
- 28. 從腳本添加到整體佈局控制器
- 29. 在C#從模型添加列表到控制器(MVC)
- 30. C#mvc控制器到類
請注意,TempData在MVC框架中有一些默認行爲,例如內容從Session中清除並移動到ControllerContext中的臨時容器。由於TempData實際上只是Session的一個簡單包裝,如果您需要像這樣保存數據,您可能需要考慮編寫自己的會話包裝器,但如果沒有TempData現有行爲的約束,則可能會受益。 – Alex 2014-07-08 04:49:54