告诉操作/控制器保持TempData

时间:2009-11-03 11:31:59

标签: asp.net-mvc attributes persistence tempdata

我知道TempData只能在单个页面请求之间工作。但我认为有一种情况我认为打破了预期的功能。

我使用控制器而不是处理程序来传递图像。如果这是最佳实践,我现在不会,但它对我来说非常好。但问题是,对其中一个图片操作的每次调用显然都会使用TempData信用。

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

3 个答案:

答案 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);

您可以从数据存储区或某处获取字节数。

希望有所帮助