没有清除tempdata的问题

时间:2014-03-05 09:48:49

标签: c# javascript jquery asp.net-mvc tempdata

在我的应用程序中,我创建了一个基本控制器。所有其他控制器都来自BaseController

public class BaseController : Controller
{
    //
    // GET: /Base/
    public void Warning(string message)
    {
        TempData.Add(Alerts.WARNING, message);
    }
    public void Success(string message)
    {
        TempData.Add(Alerts.SUCCESS, message);
    }

    public void Information(string message)
    {
        TempData.Add(Alerts.INFORMATION, message);
    }

    public void Error(string message)
    {
        TempData.Add(Alerts.ERROR, message);
    }
}

如果我从BaseController派生任何其他控制器,则可以执行此操作

public ActionResult Test()
{
   Success("This is a success Alert");
}

现在在_alert partial view我检查了tempdata并使用Toastr咆哮。

_alerts部分视图

@if (TempData.ContainsKey(Alerts.SUCCESS))
{
    foreach (var value in TempData.Values)
    {
        <script>    
            toastr.success("@value.ToString()");
        </script>

    }


}

@if (TempData.ContainsKey(Alerts.ERROR))
{
    foreach (var value in TempData.Values)
    {
        <script>

            toastr.error("@value.ToString()");
        </script>
    }
}

@if (TempData.ContainsKey(Alerts.INFORMATION))
{
    foreach (var value in TempData.Values)
    {
        <script>

            toastr.warning("@value.ToString()");
        </script>
    }
}

@if (TempData.ContainsKey(Alerts.WARNING))
{
    foreach (var value in TempData.Values)
    {
        <script>    
            toastr.warning("@value.ToString()");
        </script>
    }
}

_alert部分视图在我的_layout视图中呈现。这是应用程序的主要布局。

所有页面都使用该布局。

问题:

我面临的问题是,一旦我从控制器发送消息,例如:

Success("This is a success message");

我在浏览器中收到了一条很好的消息。但每次我转到下一页时,我都会得到相同的消息,因为它仍然保留在我的TempData中。

我该怎么做才能解决这个问题?

我可能要清除临时数据,但在哪里?

我尝试从视图中清除TempData: 但它不允许我。我在浏览器上遇到错误,说我只能执行赋值,递增,递减和创建对象等事情而不是TempData.Clear();。另外,在客户端执行清除TempData不是一个好主意,不是吗?

2 个答案:

答案 0 :(得分:1)

您是否可以尝试将ContainsKey的所有用法更改为非空检查?

更改此

@if (TempData.ContainsKey(Alerts.INFORMATION))
{
}

@if (TempData[Alerts.INFORMATION] != null)
{
}

外观上只有在读取时才清除TempData,并且调用ContainsKey不算作读取。 相关的Stackoverflow文章here

更新:尝试使用以下代码。 每次重新加载时,TempData["S"]都为空并重新填充消息(因此这是预期的行为)。

BaseController

public class BaseController : Controller
{
    public void Success(string message)
    {
        TempData.Add("S", message);
    }
}

的HomeController

public ActionResult Test()
{
    Success("This is a success Alert");
    return View();
}

查看

@if (TempData["S"] != null)
{
    foreach (var value in TempData.Values)
    {
        @value.ToString()
    }
}

答案 1 :(得分:1)

这似乎已经成功了

@if (TempData.ContainsKey(Alerts.SUCCESS))
{
    foreach (var value in TempData.Values)
    {
        <script>    
            toastr.success("@value.ToString()");
        </script>

    }
    TempData.Remove(Alerts.SUCCESS);

}

但我仍然不知道从视图中清除TempData是否是一个好主意。

建议?