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

简介:   在第一篇中,我讲解了我们要做智能查询的原因,以及基本的解决方案设计。从这篇开始我们开始讲解它的实现过程。  其实在写这一系列文章之初,我其实是想由底至上去讲解,但是我又整理了一遍代码才发现,其实如果不了解最表面的东西,也是不太好深入的。

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

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

  所以我们的第二篇文章就来讲一下我们这个智能查询框架中最浅,但也是使用最频繁的部分,也就是Model。

  首先我们的Entity  或者说数据库的结构如下:

image  另外如下面代码,我们有一个用于传递name=value对,及查询谓词的model:

 
 
public ActionResult Index(QueryModel model)
{
using (var db = new DbEntities())
{
var list
= db.Users.Where(model).ToList();
return View(lis上海企业网站制作t);
}
}

  我命名之为QueryModel。它由Action的参数传入,再传入EF的Where扩展方法,它是构建Lambda表达式的原型,上面是我们的一个通用的查询Action的代码。

  而QueryModel的代码为:

image  QueryModel的唯一一个属性Items,是一个ConditionItem的集合,它里面存着所有的查询条件。而ConditionItem里面的属性:

  1. Field表示要查询的目标属性的名称,我们的设定它是支持子属性查询的,例如 “Profile.MyUser.Id”。
  2. Method则是当前使用的谓词,它是QueryMethod的一个枚举值。
  3. OrGroup是一个字符串,是一个OrGroup的多个表达式将会以Or操作符进行关联,然后再And。
  4. Prefix是一个分类的前缀,我们假定一个Action可能处理多个查询条件组的时候为了分开这些查询条件而加的属性。
  5. Value则是这个表达试的值。

  而我们在页面上类似:

 
   
< 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 >

  这样的表单,我们提交到服务器端,我们要进行ASP.NET MVC 中IModelBinder的转换,要将querystring 或 postdata中的KeyValuePair转换为我们的ConditionItem。

  当然,我们除了谓词Method之外,还有Prefix以及OrGroup要从客户端提交过来所以我们就要制定一个规则,我们约定:

  1. 中括号[]中的为查询谓词
  2. 小括号()中的为前缀Prefix
  3. 大括号{}中的为OrGroup

  我们可以通过以下IModelBinder的实现将Request.QueryString或Request.Form中的值转换到QueryModel中:

 
   
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>
/// <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);
}
}
}

  当然我们还要在Global.asax中添加:

 
 
ModelBinders.Binders.Add( typeof (QueryModel), new SearchModelBinder());

  这样我们就可以在Action中获取到相应的查询条件了:

image  我们可以看到,从表单提交过来的数据我们已经正确地存放在QueryModel中了。

目录
相关文章
|
4月前
|
设计模式 存储 前端开发
MVC(模型-视图-控制器)是一种在Web应用程序开发中广泛使用的软件设计模式
【5月更文挑战第12天】MVC模式是Web应用开发中的常见设计模式,将逻辑、数据和界面分离,提升代码可维护性和重用性。模型处理数据逻辑,视图展示数据,控制器协调用户输入与模型视图交互。优点包括代码分离、易维护、可扩展和组件重用,促进高效灵活的开发。
47 2
|
16天前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
4月前
|
开发框架 缓存 前端开发
利用Visual Basic构建高效的ASP.NET Web应用
【4月更文挑战第27天】本文探讨使用Visual Basic与ASP.NET创建高效Web应用的策略,包括了解两者基础、项目规划、MVC架构、数据访问与缓存、代码优化、异步编程、安全性、测试及部署维护。通过这些步骤,开发者能构建出快速、可靠且安全的Web应用,适应不断进步的技术环境。
73 0
|
6天前
|
开发框架 .NET 开发工具
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
|
2月前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
15天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
26 0
|
16天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
16天前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
20天前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
72 0
|
3月前
|
设计模式 前端开发 安全
理解最常用的MVC分层模型及其变种
【6月更文挑战第24天】 本文介绍架构模式如MVC、MVVM和MVP是解决软件结构问题的通用方案。。每种模式有其优缺点,适用场景不同。
92 0
理解最常用的MVC分层模型及其变种