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 的大致有以下三种:

  1. Action 中的字符串参数,如 Query 方法中的 name 参数。
  2. Action 中的复杂类型参数的字符串属性,如 Create 方法中的 person 的 Name 属性。
  3. 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 优秀的设计和架构。

转载请注明本文地址:

http://www.cnblogs.com/ldp615/archive/2010/12/29/asp-net-mvc-create-model-binder-to-trim-all-string.html

本人 MVC 文章,欢迎阅读:

ASP.NET MVC:自定义 Route 以生成小写的 Url

ASP.NET MVC:窗体身份验证及角色权限管理示例

ASP.NET MVC : 请求处理流程 (Request-Handling Pipeline)

ASP.NET MVC:通过 FileResult 向浏览器发送文件

ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息

ASP.NET MVC: 使用 Filters 附加过滤敏感信息功能

c#扩展方法奇思妙用 ASP.NET MVC 篇:巧用扩展方法优先级,美化所有页面 TextBoxFor 文本框

-------------------

思想火花,照亮世界

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 所有字符串的更多相关文章

  1. [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

    [ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>       ...

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

  3. ASP.NET MVC创建的网站

    ASP.NET MVC创建的网站   最近在写一个网站,昨天刚写完,由于要和朋友一起测试,但是他电脑上没有环境,所以希望我在自己电脑上部署一下,让他直接通过浏览器来访问来测试,所以从昨晚到今天上午,通 ...

  4. ASP.NET MVC 创建 Area 以及使用

    此博客全乘抄袭,只为以后自己能再次用到 参考链接 http://www.cnblogs.com/willick/p/3331519.html ASP.NET MVC允许使用 Area(区域)来组织We ...

  5. ASP.NET MVC - 创建Internet 应用程序

    为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序. 第 1 部分:创建应用程序. 我们将构建什么 我们将构建一个支持添加.编辑.删除和列出数据库存储信息的 Internet ...

  6. ASP.NET MVC 创建控制器类过程

    MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...

  7. 让别人也可以访问你电脑上的ASP.NET MVC创建的网站

    最近在写一个网站,昨天刚写完,由于要和朋友一起测试,但是他电脑上没有环境,所以希望我在自己电脑上部署一下,让他直接通过浏览器来访问来测试,所以从昨晚到今天上午,通过各种搜索,终于搞定了. 先介绍一下我 ...

  8. ASP.NET MVC创建静态页

    1.在MVC下新建一个类:StaticPageHelper public class StaticPageHelper { /// <summary> /// 根据View视图生成静态页面 ...

  9. ASP.NET MVC创建视图过程

    MvcHandler.ProcessRequest()   (1)获取Action执行结果:context2.Result ActionExecutedContext context2 = this. ...

随机推荐

  1. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12247   Accepted: 3151 Descriptio ...

  2. 记一次对python反弹shell的分析

    前言 昨天学习了反弹shell,对python弹shell产生了一些疑惑 python -c 'import socket,subprocess,os;s=socket.socket(socket.A ...

  3. 0103 最短Hamilton路径【状压DP】

    0103 最短Hamilton路径 0x00「基本算法」例题 描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Ham ...

  4. poj3233(等比矩阵求和)

    poj3233 题意 给出一个 \(n \times n\) 的矩阵 \(A\) ,求 \(A + A^2 + A^3 + ... + A^k\) . 分析 构造矩阵 \[ \begin{bmatri ...

  5. POJ2342 Anniversary party(动态规划)(树形DP)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6635   Accepted: 3827 ...

  6. 【AC自动机】zoj3228 Searching the String

    对所有模式串建立AC自动机. 每个单词结点要记录该单词长度. 然后在跑匹配的时候,对每个单词结点再处理3个值,代表可重叠的匹配次数,不可重叠的匹配次数,以及“上一次不可重叠的匹配位置”,这样结合单词长 ...

  7. 求一个整数个位数之和 Exercise06_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求一个整数个位数之和 * */ public class Exercise ...

  8. JQuery使用trigger模拟触发selete的选择change事件

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. Word中插入带公式的Visio注意事项

    有时候发现,有的公式显示的间距特别大,那么在word中右键打开Visio,改好后,保存了,word里还是那样. 因为你需要吧改好的另存为原来的visio文件(名字.位置要一样,就是说替换原来的文件), ...

  10. 【mybatis】idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin

    idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin,名字可能叫Free mybatis-plugin 安装上之后,可能需要重启ide ...