ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串
ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串
2010-12-29 21:32 by 鹤冲天, 4289 阅读, 14 评论, 收藏, 编辑
用户输入的字符串前后的空格会对程序造成很大的危害,最常见的问题就是查询和统计错误。作为严谨的开发人员,我们应该主动进行处理。
逐个 Trim 相当麻烦
.NET 中为我们提供了三个字符串处理函数,相信大家一定都用过:Trim、TrimStart、TrimEnd。
但在实际应用中,逐个 Trim 是相当麻烦的。我们来分析下,请看如下 Controller 及其 Model:
public class PersonController : Controller
{
public ActionResult Query(string name)
{
//...
}
//...
[HttpPost]
public ActionResult Create(Person person)
{
//...
}
[HttpPost]
public ActionResult Create2(FormCollection collection)
{
Person person = new Person();
UpdateModel(person, collection);
//...
}
//...
}
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
}
需要进行 Trim 的大致有以下三种:
- Action 中的字符串参数,如 Query 方法中的 name 参数。
- Action 中的复杂类型参数的字符串属性,如 Create 方法中的 person 的 Name 属性。
- Action 中显式绑定的复杂类型的字符串属性,如 Create2 方法中的 person 的 Name 属性。
如果 Model 更复杂:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public string[] Hobbies { get; set; }
public Person Father { get; set; }
}
还需要对 Hobbies 和 Father.Name 进行处理…
但在 MVC 中可以通过 ModelBinder 来轻松解决。
使用 ModelBinder 来解决 Trim 问题
使用 ModelBinder 来解决 Trim 问题,有 N 多种方式,本文介绍最简单的一种,只需要以下两步:
1. 创建一个有 Trim 功能的 ModelBinder(仅用于 string 类型):
public class StringTrimModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = base.BindModel(controllerContext, bindingContext);
if (value is string) return (value as string).Trim();
return value;
}
}
简单吧,就三行代码(其实还可以再精简)。
2. 在 Global.asax 中为 string 类型指定这个 ModelBinder:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(string), new StringTrimModelBinder());
//...
}
//...
}
根据 MVC 的绑定机制,所有的字符串绑定都将会使用 StringTrimModelBinder。
也就是说,我们前面应用场景中提到的各种类型字符串都可以自动 Trim 了,包括 person.Name、 person.Hobbies 和 person.Father.Name。
OK!简单吧,这完全得益于 MVC 优秀的设计和架构。
转载请注明本文地址:
本人 MVC 文章,欢迎阅读:
ASP.NET MVC:自定义 Route 以生成小写的 Url
ASP.NET MVC : 请求处理流程 (Request-Handling Pipeline)
ASP.NET MVC:通过 FileResult 向浏览器发送文件
ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息
-------------------
思想火花,照亮世界
http://www.cnblogs.com/ldp615/archive/2010/12/29/asp-net-mvc-create-model-binder-to-trim-all-string.html
ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串的更多相关文章
- [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》
[ASP.NET MVC2 系列] [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序> ...
- ASP.NET MVC 3 loginUrl自动变成Account/Login,并且发生404错误的解决方法
http://www.cnblogs.com/think8848/archive/2011/07/08/2100814.html ASP.NET MVC 3 loginUrl自动变成Account/L ...
- ASP.NET MVC创建的网站
ASP.NET MVC创建的网站 最近在写一个网站,昨天刚写完,由于要和朋友一起测试,但是他电脑上没有环境,所以希望我在自己电脑上部署一下,让他直接通过浏览器来访问来测试,所以从昨晚到今天上午,通 ...
- ASP.NET MVC 创建 Area 以及使用
此博客全乘抄袭,只为以后自己能再次用到 参考链接 http://www.cnblogs.com/willick/p/3331519.html ASP.NET MVC允许使用 Area(区域)来组织We ...
- ASP.NET MVC - 创建Internet 应用程序
为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序. 第 1 部分:创建应用程序. 我们将构建什么 我们将构建一个支持添加.编辑.删除和列出数据库存储信息的 Internet ...
- ASP.NET MVC 创建控制器类过程
MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...
- 让别人也可以访问你电脑上的ASP.NET MVC创建的网站
最近在写一个网站,昨天刚写完,由于要和朋友一起测试,但是他电脑上没有环境,所以希望我在自己电脑上部署一下,让他直接通过浏览器来访问来测试,所以从昨晚到今天上午,通过各种搜索,终于搞定了. 先介绍一下我 ...
- ASP.NET MVC创建静态页
1.在MVC下新建一个类:StaticPageHelper public class StaticPageHelper { /// <summary> /// 根据View视图生成静态页面 ...
- ASP.NET MVC创建视图过程
MvcHandler.ProcessRequest() (1)获取Action执行结果:context2.Result ActionExecutedContext context2 = this. ...
随机推荐
- 51nod 1344 走格子【贪心/前缀和】
1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...
- python 2 控制台传参,解包,编码问题初探
python 2 控制台传参,需要从sys模块中导入argv,argv返回的第一个参数当前脚本(script)的文件名,后面是参数,参数个数必须和解包(unpack)时使用的参数个数一致 1.本例子演 ...
- fastxml Jackson annotation使用小记
dependencies: compile("com.fasterxml.jackson.core:jackson-annotations") compile("com. ...
- 【转】vector用法
原博地址:http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html 在c++中,vector是一个十分有用的容器,下面对这个容器做一下总 ...
- java.net.MalformedURLException: Protocol not found:
出现java.net.MalformedURLException: Protocol not found: 一般来说是url地址没有写对.没有以http://开头,或者出现空格等格式问题: 要看清楚 ...
- 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程
在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...
- 【左偏树】BZOJ2809-[APIO2012]dispatching
[题目大意] 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同 ...
- Tomcat部署时war和war exploded的区别
转自徐刘根的Tomcat部署时war和war exploded区别以及平时踩得坑 一.war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: ...
- nativeexcel将excel导入数据集
nativeexcel将excel导入数据集 uses nexcel; procedure Tfgoods.daoruExecute(Sender: TObject);var od: TOpenDia ...
- 本机搭建PHP环境全教程(图文)
为了更好的维护空间网站,研究和调试PHP程序,许多人需要在自己的计算机内搭建PHP环境.本文将介绍使用phpnow环境组件搭建的全过程.使用搜索工具,搜索phpnow<ignore_js_op& ...