asp.net mvc 实现记忆返回的功能
大体思路是在当前跳转链接追加一个参数memoryguid,以guid为key把查询query保存在cookie里,跳转的时候带走这个guid,回来的时候还带着,这样我们就能根据这个guid从cookie里获取我们的query了.思路确定了,根据实际的情况实现适合自己的代码就行了,我们index是主页,list是一个分部页,因此我定义了两个Attribute来搞定这件事,代码如下:
public class MemoryGoAttribute : ActionFilterAttribute
{
private readonly string _queryName;
/// <summary>
/// 保存的查询实体的参数名称
/// </summary>
/// <param name="queryName"></param>
public MemoryGoAttribute(string queryName)
{
_queryName = queryName;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var parameters = filterContext.ActionParameters;
if (!string.IsNullOrEmpty(_queryName))
{
object queryModel;
var flag = parameters.TryGetValue(_queryName, out queryModel);
if (flag)
{
//生成唯一标识 area controller action
//var uniqueId = Guid.NewGuid().ToString("N");
var uniqueId = filterContext.RouteData.DataTokens["area"].ToString()
+ filterContext.RouteData.Values["controller"].ToString()
+ filterContext.RouteData.Values["action"].ToString();
uniqueId = uniqueId.ToLower();
//将唯一标识添加到RouteData
filterContext.RouteData.Values.Add("memoryguid", uniqueId);
//存入cookie
var json = JsonConvert.SerializeObject(queryModel);
CookieHelper.ClearCookie(uniqueId);
var cookieHelper = CookieHelper.AddCookie(uniqueId, json, iDays: 0, iHours: 1);
}
}
base.OnActionExecuting(filterContext);
}
}
上边是在list上应用的特性,下边是应用在index上的特性
public class MemoryBackAttribute : ActionFilterAttribute
{
private readonly Type _queryType;
/// <summary>
/// 查询实体的类型
/// </summary>
/// <param name="queryType"></param>
public MemoryBackAttribute(Type queryType)
{
_queryType = queryType;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var queryString = filterContext.HttpContext.Request.QueryString;
var uniqueId = queryString.Get("memoryguid");
if (!string.IsNullOrEmpty(uniqueId))
{
var json = CookieHelper.GetCookie(uniqueId.ToString());
if (!string.IsNullOrEmpty(json))
{
var dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
//dic to obj
var obj = Activator.CreateInstance(_queryType);
foreach (var prop in _queryType.GetProperties())
{
object value;
if (dic.TryGetValue(prop.Name, out value))
{
var type = prop.PropertyType;
//把数据转换成指定的类型,
prop.SetValue(obj, ChangeType(value, type), null);
}
}
filterContext.Controller.ViewBag.MemoryObj = obj;
//dic to url: key=value&key=value
var url = new StringBuilder();
dic.Keys.ToList().ForEach(key => { url.AppendFormat("{0}={1}&", key, dic[key]); });
filterContext.Controller.ViewBag.MemoryStr = url.ToString();
}
}
base.OnActionExecuting(filterContext);
}
//转换成指定的类型
private object ChangeType(object obj, Type type)
{
//判断type类型是否为泛型,因为nullable是泛型类,
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(type);
//将type转换为nullable对的基础基元类型
type = nullableConverter.UnderlyingType;
}
try
{
return Convert.ChangeType(obj, type, CultureInfo.InvariantCulture);
}
catch (Exception)
{
//不能转换
return null;
}
}
}
然后页面上的链接需要将我们的这个guid追加上去,因此我写了个UrlHelper的扩展方法
public static class UrlHelperExtension
{
public static string MemoryAction(this UrlHelper url, string actionName, string controllerName, object routeValues)
{
var originalUrl = url.Action(actionName, controllerName, routeValues);
var concat = originalUrl.Contains("?") ? "&" : "?";
object uniqueId;
//从RouteData中获取
var routeData = url.RequestContext.RouteData.Values;
if (routeData.TryGetValue("memoryguid", out uniqueId))
{
return string.Format(originalUrl + "{0}memoryguid={1}", concat, uniqueId);
}
//从QueryString中获取
var queryString = url.RequestContext.HttpContext.Request.QueryString;
uniqueId = queryString.Get("memoryguid");
if (uniqueId != null)
{
return string.Format(originalUrl + "{0}memoryguid={1}", concat, uniqueId);
}
return originalUrl;
}
}
这样就大功告成了,我的实际应用是这样的
[MemoryBack(typeof(QueryModel))]
public ActionResult Index()
{
}
[MemoryGo("query")]
public PartialViewResult List(QueryModel query)
{
}
<a href="Url.MemoryAction("action","controller",new{})" />
以上都是自己现在能想到,如果你们还有其它更好的思路和实现,请不要吝啬告诉我啊
asp.net mvc 实现记忆返回的功能的更多相关文章
- Asp.net MVC 中Controller返回值类型ActionResult
[Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一. ASP.NET MVC 1.0 Result 几何? Action的 ...
- 为ASP.NET MVC应用程序使用高级功能
为ASP.NET MVC应用程序使用高级功能 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...
- ASP.NET MVC应用程序实现下载功能
ASP.NET MVC应用程序实现下载功能 上次Insus.NET有在MVC应用程序实现了上传文件的功能<MVC应用程序显示上传的图片> http://www.cnblogs.com/in ...
- asp.net MVC控制器中返回JSON格式的数据时提示下载
Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...
- ASP.NET MVC处理JsonResult返回时间DateTime问题
在开发ASP.NET MVC时,如果你有使用jQuery的Ajax去获取一些json数据时,其中数据返回有包含日期时间的话,也许会觉得有点小问题. 现针对此问题,写一个小例子来演示一下,创建一个控制器 ...
- 关于ASP.NET MVC 中JsonResult返回的日期值问题
最近开始用MVC做项目,在使用 JsonResult返回数据的时候,日期被反射成了/Date 1233455这种格式,遍查网上都是在客户端使用JS来处理这个问题的,这样的话,就需要在每一个涉及到日期的 ...
- asp.net mvc Controller控制器返回类型
ASP.NET MVC包括了执行常见任务的ActionResult类型.这些类型罗列在表5-1中.每个类型都将在随后的小节中详细讨论. 表5-1 动作结果的类型及其说明 动作结果的类型 说 明 ...
- ASP.NET MVC中Controller返回值类型ActionResult
1.返回ViewResult视图结果,将视图呈现给网页 public class TestController : Controller { //必须存在Controller\Test\Index.c ...
随机推荐
- POOL
#ifndef POOL_HHH #define POOL_HHH #include "common.h" /* simple and fast obj pool without ...
- bzoj 1053: [HAOI2007]反素数ant 搜索
1053: [HAOI2007]反素数ant Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1497 Solved: 821[Submit][Sta ...
- 百度统计js被劫持用来DDOS Github
今天中午刷着全国最大的信息安全从业人员同性交友社区zone.wooyun.org的时候,忽然浏览器每隔2秒就不断的弹窗: malicious javascript detected on this d ...
- Alice's Chance
poj1698:http://poj.org/problem?id=1698 题意:爱丽丝要拍电影,有n部电影,规定爱丽丝每部电影在每个礼拜只有固定的几天可以拍电影,只可以拍前面w个礼拜,并且这部电影 ...
- java4中创建内对象的方法
在java程序中,对象可以被显式地或者隐式地创建.四种显式的创建对象的方式: ● 用new语句创建对象 ● 运用反射手段,调用java.lang.Class 或者 java.lang. ...
- UML-图的意义
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...
- 坑爹的Android Ble 问题记录日志
开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无 ...
- java学习面向对象之异常之二
我们知道当我们处理异常的时候,一个是声明,另外一个是捕捉. 捕捉:异常处理的捕捉方式,这是可以对异常进行针对性处理的方式.具体格式是: try { //需要被检测的异常 } catch(异常类 变量) ...
- 一起啃PRML - 1 Introduction 绪论
一起啃PRML - 1 Introduction @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 这一部分主要是介绍一下Pattern Recogni ...
- 串口传输文件 lrzsz
假设有一种开发环境,一块板子,除了串口,没有任何外部出入输出设备,没有sd卡,没有网线,这个时候如果你想跟这块板子传输交互文件,要怎么办? 根据modem所采用的文件传输协议:xmodem,ymode ...