一起谈.NET技术,ASP.NET MVC & EF 构建智能查询 二、模型的设计与ModelBinder
2011-09-02 00:19
1301 查看
在第一篇中,我讲解了我们要做智能查询的原因,以及基本的解决方案设计。从这篇开始我们开始讲解它的实现过程。
其实在写这一系列文章之初,我其实是想由底至上去讲解,但是我又整理了一遍代码才发现,其实如果不了解最表面的东西,也是不太好深入的。
所以我们的第二篇文章就来讲一下我们这个智能查询框架中最浅,但也是使用最频繁的部分,也就是Model。
首先我们的Entity 或者说数据库的结构如下:
另外如下面代码,我们有一个用于传递name=value对,及查询谓词的model:
[/code]
这样的表单,我们提交到服务器端,我们要进行ASP.NET MVC 中IModelBinder的转换,要将querystring 或 postdata中的KeyValuePair转换为我们的ConditionItem。
当然,我们除了谓词Method之外,还有Prefix以及OrGroup要从客户端提交过来所以我们就要制定一个规则,我们约定:
中括号[]中的为查询谓词
小括号()中的为前缀Prefix
大括号{}中的为OrGroup
我们可以通过以下IModelBinder的实现将Request.QueryString或Request.Form中的值转换到QueryModel中:
[/code]
当然我们还要在Global.asax中添加:
这样我们就可以在Action中获取到相应的查询条件了:
我们可以看到,从表单提交过来的数据我们已经正确地存放在QueryModel中了。
其实在写这一系列文章之初,我其实是想由底至上去讲解,但是我又整理了一遍代码才发现,其实如果不了解最表面的东西,也是不太好深入的。
所以我们的第二篇文章就来讲一下我们这个智能查询框架中最浅,但也是使用最频繁的部分,也就是Model。
首先我们的Entity 或者说数据库的结构如下:
另外如下面代码,我们有一个用于传递name=value对,及查询谓词的model:
[code]<form action="" method="post"> 姓名:<input id="Name" name="[Like]Name" type="text" value="" /> Email:<input id="Email" name="[Equal]Email" type="text" value="" /><br /> Id: <input id="Id" name="[Equal]Id" type="text" value="" /> 生日: <input id="Birthday" name="[Equal]Birthday" type="text" value="" /><br /> <input type="submit" value="查询" /> </form>
[/code]
这样的表单,我们提交到服务器端,我们要进行ASP.NET MVC 中IModelBinder的转换,要将querystring 或 postdata中的KeyValuePair转换为我们的ConditionItem。
当然,我们除了谓词Method之外,还有Prefix以及OrGroup要从客户端提交过来所以我们就要制定一个规则,我们约定:
中括号[]中的为查询谓词
小括号()中的为前缀Prefix
大括号{}中的为OrGroup
我们可以通过以下IModelBinder的实现将Request.QueryString或Request.Form中的值转换到QueryModel中:
[code] [code]public class SearchModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var model = (QueryModel)(bindingContext.Model ?? new QueryModel()); var dict = controllerContext.HttpContext.Request.Params; var keys = dict.AllKeys.Where(c => c.StartsWith("["));//我们认为只有[开头的为需要处理的 if (keys.Count() != 0) { foreach (var key in keys) { if (!key.StartsWith("[")) continue; var val = dict[key]; //处理无值的情况 if (string.IsNullOrEmpty(val)) continue; AddSearchItem(model, key, val); } } return model; } /// <summary> /// 将一组key=value添加入QueryModel.Items /// </summary> /// <param name="model">QueryModel</param> /// <param name="key">当前项的HtmlName</param> /// <param name="val">当前项的值</param> public static void AddSearchItem(QueryModel model, string key, string val) { string field = "", prefix = "", orGroup = "", method = ""; var keywords = key.Split(']', ')', '}'); //将Html中的name分割为我们想要的几个部分 foreach (var keyword in keywords) { if (Char.IsLetterOrDigit(keyword[0])) field = keyword; var last = keyword.Substring(1); if (keyword[0] == '(') prefix = last; if (keyword[0] == '[') method = last; if (keyword[0] == '{') orGroup = last; } if (string.IsNullOrEmpty(method)) return; if (!string.IsNullOrEmpty(field)) { var item = new ConditionItem { Field = field, Value = val.Trim(), Prefix = prefix, OrGroup = orGroup, Method = (QueryMethod) Enum.Parse(typeof (QueryMethod), method) }; model.Items.Add(item); } } }
[/code]
当然我们还要在Global.asax中添加:
ModelBinders.Binders.Add(typeof (QueryModel), new SearchModelBinder());
这样我们就可以在Action中获取到相应的查询条件了:
我们可以看到,从表单提交过来的数据我们已经正确地存放在QueryModel中了。
相关文章推荐
- ASP.NET MVC & EF 构建智能查询 二、模型的设计“.NET研究”与ModelBinder
- ASP.NET MVC & EF 构建智能查询 二、模型的设计与ModelBinder
- 一起谈.NET技术,ASP.NET MVC & EF 构建智能查询 一、智能查询的需求与设计
- ASP.NET MVC & EF 构建智能查询 一、智“.NET研究”能查询的需求与设计
- ASP.NET MVC & EF 构建智能查询 一、智能查询的需求与设计
- ASP.NET MVC & EF 构建智能查询 三、解析QueryModel
- 一起谈.NET技术,ASP.NET MVC 2扩展点之Model Binder
- 一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法
- 一起谈.NET技术,ASP.NET MVC 3 —— Model的使用?
- 一起谈.NET技术,走向ASP.NET架构设计——第一章:走向设计
- 一起谈.NET技术,ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI
- 一起谈.NET技术,构建高性能ASP.NET站点之三 细节决定成败
- 一起谈.NET技术,跟ASP.NET MVC一起使用jQuery
- 一起谈.NET技术,将ASP.NET MVC 2.0 部署在IIS6和IIS7上的教程
- 一起谈.NET技术,探索Asp.net mvc 的文件上传(由浅入深)
- 一起谈.NET技术,ASP.NET MVC 3 Beta新特性以及.Net开源的趋势----最新译文
- 一起谈.NET技术,ASP.NET MVC 入门介绍 (下)
- 一起谈.NET技术,NVelocity for ASP.NET MVC
- 一起谈.NET技术,Unobtrusive JavaScript in ASP.NET MVC 3
- 一起谈.NET技术,ASP.NET MVC 2示例Tailspin Travel UI层分析