gpt4 book ai didi

asp.net-mvc - 从非 Controller 类添加到 TempData

转载 作者:行者123 更新时间:2023-12-05 00:44:00 24 4
gpt4 key购买 nike

如何从非 Controller 类添加到 TempData 字典?

最佳答案

你做不是 需要 ControllerContext ,您只需要当前的 HttpContext .

而且你不需要传递任何东西,你可以创建一个新的SessionStateTempDataProvider并使用它,因为此类的 SaveTempData 方法所做的唯一一件事就是在当前 session 中的特定键上设置 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,因此如果要按顺序添加数据,显然必须依赖中间容器或编写一些额外的逻辑来将现有值与新值合并。

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

关于asp.net-mvc - 从非 Controller 类添加到 TempData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/507019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com