大体思路是在当前跳转链接追加一个参数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. php mysql PDO使用

    <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $dbh->setAttri ...

  2. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  3. Javascript禁止网页复制粘贴效果,或者复制时自动添加来源信息

    一.禁止复制 使用方法:在oncopy事件中return false oncopy="return false;" 1.禁止复制网页内容 <body oncopy=" ...

  4. 修改uCOS_II以实现“优先级+时间片”联合调度

    本文在uCOS II上增加时间片任务调度的的原理: 对设置为同优先级的任务使用时间片调度,不同优先级任务仍然使用uCOS II的优先级调度策略.在同优先级任务的时间片调度中,所有任务暂时时间片长度固定 ...

  5. WordPress Xhanch - My Twitter插件跨站请求伪造漏洞(CVE-2013-3253)

    漏洞版本: WordPress Xhanch - My Twitter Plugin 2.7.5 漏洞描述: Bugtraq ID:61629 CVE ID:CVE-2013-3253 WordPre ...

  6. Maven学习(3) - Maven和Eclipse集成和构建多模块Maven项目

    最近在工作中越来越经常的用到了Maven作为项目管理和Jar包管理和构建的工具,感觉Maven的确是很好用的.而且要将Maven的功能最大发挥出来,多模块是一个很好的集成例子. 一个Maven项目包括 ...

  7. (转载)JavaScript中的日期格式转换

    (转载)http://www.php100.com/html/webkaifa/javascript/2008/1229/1618.html 今天做页面需要把JS里面的Date规范输出为“YYYY-M ...

  8. git入门超详细(转载)

    转自:http://www.cnblogs.com/tugenhua0707/p/4050072.html Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SV ...

  9. leetcode First Missing Positive hashset简单应用

    public class Solution { public int firstMissingPositive(int[] A) { HashSet<Integer> hash=new H ...

  10. SRM 441(1-250pt, 1-500pt)

    DIV1 250pt 题意:用数组A表示置换,由该置换得到数组B(B[0] = 0, B[i] = A[B[i-1]]).给定A,求一个A',使得由A'得到的B为单循环置换且A'与A的差距最小.定义A ...