我知道TempData只能在单个页面请求之间工作。但我认为有一种情况我认为打破了预期的功能。
我使用控制器而不是处理程序来传递图像。如果这是最佳实践,我现在不会,但它对我来说非常好。但问题是,对其中一个图片操作的每次调用显然都会使用TempData信用。
MVC中是否有一种方法可以说“此控制器/操作超出了正常页面请求的范围”,因此要么保留TempData还是将其自身从TempData生命周期中完全删除?
富
答案 0 :(得分:3)
我的解决方案是创建一个在页面请求中保持TempData的属性。我对此的初步反应是“哎呀”,但我想有效地从TempData生命周期中排除任何用属性修饰的控制器。
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];
}
}
}
对于更好的解决方案的任何反馈都将不胜感激。
富
答案 1 :(得分:0)
我不确定这个问题的确切答案,因为我自己对MVC很新。但是,我听说人们在使用AJAX请求时遇到麻烦,他们也希望在TempData数据出现之前将其删除。
我猜你可以实现自己的基于会话的系统来存储这些信息吗?
我相信其他人很快会为你提供更完整的答案!
答案 2 :(得分:-1)
我不完全理解你这样做的方式和原因,但我宁愿选择处理程序。或者如果您坚持使用控制器操作,我可以说这对我来说很好,没有任何问题可以即时提供图像,我在控制器操作中使用了FileContentResult。
像这样:
return File(imageBytes, imageType);
您可以从数据存储区或某处获取字节数。
希望有所帮助