C# 刷新后TempData不为null

C# 刷新后TempData不为null,c#,asp.net-mvc,tempdata,C#,Asp.net Mvc,Tempdata,我认为TempData应该在一次刷新或页面重定向后变为null。我的页面需要两次刷新才能清除数据,虽然这不是我想要的,但如何在刷新/重定向一次后使其变为空 @using (Html.BeginForm()) { <div class="form-group"> <button class="btn btn-default" type="submit">test</button> </div> } public vo

我认为TempData应该在一次刷新或页面重定向后变为null。我的页面需要两次刷新才能清除数据,虽然这不是我想要的,但如何在刷新/重定向一次后使其变为空

@using (Html.BeginForm())
{
    <div class="form-group">
        <button class="btn btn-default" type="submit">test</button>
    </div>
}

public void test()
{
    List<int> integers = new List<int>();
    integers.Add(10);
    integers.Add(20);

    //First Refresh and myList still has values when I want it to be null
    List<int> myList = (List<int>)TempData["test"]; // Take the value from the current data variable

    if (myList == null) // Not yet stored in session, create a new list and store it as a session variable
    {
        myList = new List<int>();
        TempData.Add("test", myList);
    }

    myList.AddRange(integers); // Add a new entry          
}
@使用(Html.BeginForm())
{
测试
}
公开无效测试()
{
列表整数=新列表();
整数。加(10);
整数。加(20);
//第一次刷新和myList在我希望它为空时仍然有值
List myList=(List)TempData[“test”];//从当前数据变量中获取值
如果(myList==null)//尚未存储在会话中,请创建一个新列表并将其存储为会话变量
{
myList=新列表();
添加(“测试”,myList);
}
myList.AddRange(整数);//添加新条目
}

如果要在请求完成后保留TempData对象中的值,则需要在当前操作中调用keep方法


如果要在请求完成后保留TempData对象中的值,则需要在当前操作中调用keep方法


如果要在请求完成后保留TempData对象中的值,则需要在当前操作中调用keep方法


如果要在请求完成后保留TempData对象中的值,则需要在当前操作中调用keep方法


我最近浏览了它的源代码,以了解TempData是如何工作的

因此,tempdata的生命周期非常不寻常,因为它只是一个请求。为了实现这一点,它维护了2个哈希集来管理密钥和数据字典:

private Dictionary<string, object> _data;
private HashSet<string> _initialKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
private HashSet<string> _retainedKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
此时保存数据的实际字典是完整的。这就是为什么我们可以连续读取相同的数据而没有任何问题。它仅从_initialKeys集合中删除密钥,基本上在数据持久化时将其标记为删除

如果希望TempData中的值持续更长时间,可以使用Peek和Keep方法。Peek所做的是返回值,而不将其从_initialKeys中删除:

public object Peek(string key)
{
    object value;
    _data.TryGetValue(key, out value);
    return value;
}
或者,您可以调用Keep方法。类似地,它不直接操作数据,只通过将密钥添加到_retainedKeys集合来标记要持久化的密钥

public bool TryGetValue(string key, out object value)
{
    _initialKeys.Remove(key);
    return _data.TryGetValue(key, out value);
}
public void Keep(string key)
{
    _retainedKeys.Add(key);
}
最后通过调用提供者的Save方法将数据保存(默认情况下保存到会话):

public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
{
    _data.RemoveFromDictionary((KeyValuePair<string, object> entry, TempDataDictionary tempData) =>
        {
            string key = entry.Key;
            return !tempData._initialKeys.Contains(key) 
                && !tempData._retainedKeys.Contains(key);
        }, this);

    tempDataProvider.SaveTempData(controllerContext, _data);
}
public void Save(ControllerContext ControllerContext,ITempDataProvider tempDataProvider)
{
_data.RemoveFromDictionary((KeyValuePair条目,TempDataDictionary tempData)=>
{
string key=entry.key;
return!tempData.\u initialKeys.Contains(key)
&&!tempData._retainedKeys.Contains(键);
},这个);
SaveTempData(controllerContext,_data);
}
因此,只有保留在_initialKeys集合(未读)中的数据和特别指示保留的数据(保留在_retainedKeys集合中的密钥)将被保存。因此,寿命


参考资料:

我最近查看了它的源代码,以了解TempData是如何工作的

因此,tempdata的生命周期非常不寻常,因为它只是一个请求。为了实现这一点,它维护了2个哈希集来管理密钥和数据字典:

private Dictionary<string, object> _data;
private HashSet<string> _initialKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
private HashSet<string> _retainedKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
此时保存数据的实际字典是完整的。这就是为什么我们可以连续读取相同的数据而没有任何问题。它仅从_initialKeys集合中删除密钥,基本上在数据持久化时将其标记为删除

如果希望TempData中的值持续更长时间,可以使用Peek和Keep方法。Peek所做的是返回值,而不将其从_initialKeys中删除:

public object Peek(string key)
{
    object value;
    _data.TryGetValue(key, out value);
    return value;
}
或者,您可以调用Keep方法。类似地,它不直接操作数据,只通过将密钥添加到_retainedKeys集合来标记要持久化的密钥

public bool TryGetValue(string key, out object value)
{
    _initialKeys.Remove(key);
    return _data.TryGetValue(key, out value);
}
public void Keep(string key)
{
    _retainedKeys.Add(key);
}
最后通过调用提供者的Save方法将数据保存(默认情况下保存到会话):

public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
{
    _data.RemoveFromDictionary((KeyValuePair<string, object> entry, TempDataDictionary tempData) =>
        {
            string key = entry.Key;
            return !tempData._initialKeys.Contains(key) 
                && !tempData._retainedKeys.Contains(key);
        }, this);

    tempDataProvider.SaveTempData(controllerContext, _data);
}
public void Save(ControllerContext ControllerContext,ITempDataProvider tempDataProvider)
{
_data.RemoveFromDictionary((KeyValuePair条目,TempDataDictionary tempData)=>
{
string key=entry.key;
return!tempData.\u initialKeys.Contains(key)
&&!tempData._retainedKeys.Contains(键);
},这个);
SaveTempData(controllerContext,_data);
}
因此,只有保留在_initialKeys集合(未读)中的数据和特别指示保留的数据(保留在_retainedKeys集合中的密钥)将被保存。因此,寿命


参考资料:

我最近查看了它的源代码,以了解TempData是如何工作的

因此,tempdata的生命周期非常不寻常,因为它只是一个请求。为了实现这一点,它维护了2个哈希集来管理密钥和数据字典:

private Dictionary<string, object> _data;
private HashSet<string> _initialKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
private HashSet<string> _retainedKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
此时保存数据的实际字典是完整的。这就是为什么我们可以连续读取相同的数据而没有任何问题。它仅从_initialKeys集合中删除密钥,基本上在数据持久化时将其标记为删除

如果希望TempData中的值持续更长时间,可以使用Peek和Keep方法。Peek所做的是返回值,而不将其从_initialKeys中删除:

public object Peek(string key)
{
    object value;
    _data.TryGetValue(key, out value);
    return value;
}
或者,您可以调用Keep方法。类似地,它不直接操作数据,只通过将密钥添加到_retainedKeys集合来标记要持久化的密钥

public bool TryGetValue(string key, out object value)
{
    _initialKeys.Remove(key);
    return _data.TryGetValue(key, out value);
}
public void Keep(string key)
{
    _retainedKeys.Add(key);
}
最后通过调用提供者的Save方法将数据保存(默认情况下保存到会话):

public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
{
    _data.RemoveFromDictionary((KeyValuePair<string, object> entry, TempDataDictionary tempData) =>
        {
            string key = entry.Key;
            return !tempData._initialKeys.Contains(key) 
                && !tempData._retainedKeys.Contains(key);
        }, this);

    tempDataProvider.SaveTempData(controllerContext, _data);
}
public void Save(ControllerContext ControllerContext,ITempDataProvider tempDataProvider)
{
_data.RemoveFromDictionary((KeyValuePair条目,TempDataDictionary tempData)=>
{
string key=entry.key;
return!tempData.\u initialKeys.Contains(key)
&&!tempData._retainedKeys.Contains(键);
},这个);
tempDataProvider.Save