3

我了解 TempData 旨在仅在单个页面请求之间工作。但我认为有一种情况我认为会破坏预期的功能。

我使用控制器而不是处理程序来传递图像。如果这是最佳做法,我现在不知道,但它对我来说效果很好。但问题是,每次调用其中一个图像操作显然都会消耗一个 TempData 信用。

MVC 中是否有办法说“此控制器/操作超出了正常页面请求的范围”,因此要么保留 TempData,要么完全从 TempData 生命周期中删除自己?

富有的

4

3 回答 3

3

我的解决方案是创建一个跨页面请求持久保存 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];
        }
    }
}

任何关于更好解决方案的反馈将不胜感激。

富有的

于 2009-11-03T14:08:03.277 回答
0

我不确定这个问题的确切答案,因为我自己对 MVC 还是很陌生。但是,我听说有人在处理 AJAX 请求时遇到问题,在他们想要之前就将 TempData 杀掉了。

我猜你可以实现你自己的基于会话的系统来存储这些信息?

不过,我相信其他人很快就会为您提供更完整的答案!

于 2009-11-03T11:39:54.777 回答
-1

我不完全理解你这样做的方式以及为什么,但我宁愿和处理程序一起去。或者,如果您坚持使用控制器操作,我可以说这对我来说很好,没有任何即时交付图像的问题,并且我在控制器操作中使用了 FileContentResult。

像这样:

        return File(imageBytes, imageType);

您从数据存储或某处获取字节..

希望能帮助到你

于 2009-11-03T12:02:23.447 回答