在我的应用程序中,我创建了一个基本控制器。所有其他控制器都来自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不是一个好主意,不是吗?
答案 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是否是一个好主意。
建议?