我了解 TempData 旨在仅在单个页面请求之间工作。但我认为有一种情况我认为会破坏预期的功能。
我使用控制器而不是处理程序来传递图像。如果这是最佳做法,我现在不知道,但它对我来说效果很好。但问题是,每次调用其中一个图像操作显然都会消耗一个 TempData 信用。
MVC 中是否有办法说“此控制器/操作超出了正常页面请求的范围”,因此要么保留 TempData,要么完全从 TempData 生命周期中删除自己?
富有的
我了解 TempData 旨在仅在单个页面请求之间工作。但我认为有一种情况我认为会破坏预期的功能。
我使用控制器而不是处理程序来传递图像。如果这是最佳做法,我现在不知道,但它对我来说效果很好。但问题是,每次调用其中一个图像操作显然都会消耗一个 TempData 信用。
MVC 中是否有办法说“此控制器/操作超出了正常页面请求的范围”,因此要么保留 TempData,要么完全从 TempData 生命周期中删除自己?
富有的
我的解决方案是创建一个跨页面请求持久保存 TempData 的属性。我对此的最初反应是“糟糕”,但我想有效地从 TempData 生命周期中排除任何用 Attribute 装饰的控制器。
using System.Web.Mvc;
namespace K3R.Web.Mvc.Filters {
public sealed class PersistTempDataAttribute : ActionFilterAttribute {
public PersistTempDataAttribute() { }
public override void OnActionExecuting(ActionExecutingContext filterContext) {
var tempData = filterContext.Controller.TempData;
if (tempData == null || tempData.Count == 0)
return;
string[] keys = new string[tempData.Keys.Count];
tempData.Keys.CopyTo(keys, 0);
foreach (var key in keys)
tempData[key] = tempData[key];
}
}
}
任何关于更好解决方案的反馈将不胜感激。
富有的
我不确定这个问题的确切答案,因为我自己对 MVC 还是很陌生。但是,我听说有人在处理 AJAX 请求时遇到问题,在他们想要之前就将 TempData 杀掉了。
我猜你可以实现你自己的基于会话的系统来存储这些信息?
不过,我相信其他人很快就会为您提供更完整的答案!
我不完全理解你这样做的方式以及为什么,但我宁愿和处理程序一起去。或者,如果您坚持使用控制器操作,我可以说这对我来说很好,没有任何即时交付图像的问题,并且我在控制器操作中使用了 FileContentResult。
像这样:
return File(imageBytes, imageType);
您从数据存储或某处获取字节..
希望能帮助到你