您的位置:首页 > 编程语言 > ASP

ASP.NET MVC & EF 构建智能查询 二、模型的设计“.NET研究”与ModelBinder

2011-10-18 22:39 771 查看
  在第一篇中,我讲解了我们要做智能查询的原因,以及基本的解决方案设计。从这篇开始我们开始讲解它的实现过程。

  其实在写这一系列文章之初,我其实是想由底至上去讲解,但是我又整理了一遍代码才发现,其实如果不了解最表面的东西,也是不太好深入的。

  所以我们的第二篇文章就来讲一下我们这个智能查询框架中最浅,但也是使用最频繁的部分,也就是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="" />
生日: 上海徐汇企业网站制作 style="color: #0000ff;"><input 上海闵行企业网站设计与制作an style="color: #ff0000;">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)) 上海闵行企业网站制作yle="color: #0000ff;">continue;
AddSearchItem(model, key, val);
}
}
return model;
}

/// <summary>
///上海网站建设yle="color: #008000;"> 将一组key=value添加入QueryModel.Items
/// 上海徐汇企业网站设计与制作"></summary>
/// <param name="model">QueryModel</param>
/// 上海企业网站设计与制作#808080;"><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中了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: