从非控制器类添加到TempData

时间:2009-02-03 13:14:08

标签: asp.net-mvc

如何从非控制器类添加到TempData字典?

4 个答案:

答案 0 :(得分:3)

您必须将TempDataDictionary传递给其他类。我这样做了很多,并且它没有任何问题,只要其他类与演示相关(听起来就像它)。

答案 1 :(得分:2)

需要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);

请注意,每次都会覆盖现有的Dictionary,因此如果要按顺序添加数据,则显然必须依赖中间容器或编写一些额外的逻辑来将现有值与新值合并。

我需要这样做的情况是错误页面处理,我在那里进行重定向,但我需要将临时数据保存在控制器范围之外的逻辑。

答案 2 :(得分:1)

ControllerBase.TempData属性

System.Web.Mvc.TempDataDictionary

您可以使用公共TempDataDictionary TempData {get;组; }

使用 TempData

<强> e.g。像TempData.Clear(); //在其他课程中清除TempData

答案 3 :(得分:0)

为此,您需要当前的控制器上下文,否则您不能。

ViewContext.Controller.TempData [“whatever”] = what