大体思路是在当前跳转链接追加一个参数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 实现记忆返回的功能的更多相关文章

  1. Asp.net MVC 中Controller返回值类型ActionResult

    [Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...

  2. ASP.NET MVC – 关于Action返回结果类型的事儿(上)

    原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一.         ASP.NET MVC 1.0 Result 几何? Action的 ...

  3. 为ASP.NET MVC应用程序使用高级功能

    为ASP.NET MVC应用程序使用高级功能 这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译, ...

  4. ASP.NET MVC应用程序实现下载功能

    ASP.NET MVC应用程序实现下载功能 上次Insus.NET有在MVC应用程序实现了上传文件的功能<MVC应用程序显示上传的图片> http://www.cnblogs.com/in ...

  5. asp.net MVC控制器中返回JSON格式的数据时提示下载

    Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...

  6. ASP.NET MVC处理JsonResult返回时间DateTime问题

    在开发ASP.NET MVC时,如果你有使用jQuery的Ajax去获取一些json数据时,其中数据返回有包含日期时间的话,也许会觉得有点小问题. 现针对此问题,写一个小例子来演示一下,创建一个控制器 ...

  7. 关于ASP.NET MVC 中JsonResult返回的日期值问题

    最近开始用MVC做项目,在使用 JsonResult返回数据的时候,日期被反射成了/Date 1233455这种格式,遍查网上都是在客户端使用JS来处理这个问题的,这样的话,就需要在每一个涉及到日期的 ...

  8. asp.net mvc Controller控制器返回类型

    ASP.NET MVC包括了执行常见任务的ActionResult类型.这些类型罗列在表5-1中.每个类型都将在随后的小节中详细讨论. 表5-1  动作结果的类型及其说明 动作结果的类型 说    明 ...

  9. ASP.NET MVC中Controller返回值类型ActionResult

    1.返回ViewResult视图结果,将视图呈现给网页 public class TestController : Controller { //必须存在Controller\Test\Index.c ...

随机推荐

  1. hbase 架构

    由图可以client并不直接和master交互,而是与zookeeper交互,所以master挂掉,依然会对外提供读写服务, 但master挂掉后无法提供数据迁移服务. 所以说 hbase无单点故障, ...

  2. noip2014 考试总结

    noip:最初估分580,明间数据:570,初测估分:510-570,最终得分:570 这次noip怎么说呢,发挥的还是比较理想吧,不过还是犯了一些“低级错误”,虽然没有造成十分严重的后果,但是还是不 ...

  3. 使用Unity游戏引擎在IOS模拟器中运行的方法

    在Unity编译IOS程序时,在Unity导航栏菜单中选择Edit->ProjectSettings ->Player(菜单项)选择IOS平台在下方SDK Version处选择运行设备为I ...

  4. android.graphics.Matrix

    Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTra ...

  5. ubuntu 增加新硬盘

    在校内建了一个ftp,本来是想放一点东西的,没想到越放越多,然后硬盘就不够了. 服务器是虚拟出来的ubuntu-server 12.04.想要将新硬盘挂载到/home/ftp目录. 操作步骤: 1.可 ...

  6. poj3580

    区间操作的究极题,我们一个个来分析其实只有insert,delete,revolve三种没讲过insert 先把x旋到根,一开始我比较SB的,准备把新节点插入到右子树的最左节点,这显然很烦 好的方法是 ...

  7. bzoj1898

    这是yhc大牛矩乘论文上的题目,那里面分析得很清楚了这里就说说我一开始错的地方,我一开始处理每个时刻能通过的邻接矩阵的时候把以不能访问的点i为起点和终点的都标记为0了,实际上只能标记以i为终点的边即可 ...

  8. Frontend Development

    原文链接: https://github.com/dypsilon/frontend-dev-bookmarks Frontend Development Looking for something ...

  9. HDU 3507 Print Article(DP+斜率优化)

     Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  10. 折腾iPhone的生活——设置“查找我的iPhone”,让iPhone更防盗

    对于iPhone,防盗一直是一个非常那啥的话题,很多买过iPhone的人都被偷过,但疼,然而苹果也看到了这个问题,所以在iOS7,我们终于看到了一个比较靠谱的防盗软件:查找我的iPhone 之前小偷解 ...