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 ...
随机推荐
- [转]DOS命令
windows dos命令 - 知识天地 - 博客园http://www.cnblogs.com/mfryf/archive/2012/02/13/2348685.html
- python关键字
python有多少关键字? >>> import keyword >>> keyword.kwlist ['and', 'as', 'assert', 'break ...
- Contest 20141027 总结
这次考试主要问题出在第一题,由于考试期间没有看清题意,少看了一句 “a=A/1e9" 导致在考试结束最后5分钟发现时修改过于匆忙,改出问题了.另外,这道题同时告诉我long double 在 ...
- MVC自学系列之三(MVC视图-Views)
View的约定 1.根据约定,Views目录下包含着每一个与Controller同名但是没有像Controller后缀的文件夹:因此对于控制器HomeController就对应在views目录下有个目 ...
- System.in.read()
用读取键盘输入必须构建 1.输入流 System.in; 2.字符输入流 InputStreamReader 3.缓存输入流 BufferedRead ...
- BZOJ1606: [Usaco2008 Dec]Hay For Sale 购买干草
1606: [Usaco2008 Dec]Hay For Sale 购买干草 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 612 Solved: 46 ...
- -_-#【响应式】matchMedia
谈谈响应式Javascript <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- Delphi中TxmlDocument控件的用法 转
Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面. 在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解. 1<?xm ...
- microsoft visual studio 不能逐句执行?
最近在使用vs2013过程中,vs2013不能逐行执行,在不设断点的情况下,根本停不下来按一下F11,整个程序就执行完了.百度了很久也没找到方法(看的还不够仔细),卸载安装了很多次(看我够笨的吧),最 ...
- poj 1847 Tram【spfa最短路】
Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12005 Accepted: 4365 Description ...