ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串
2010-12-29 21:32 鹤冲天 阅读(5522) 评论(15) 编辑 收藏 举报用户输入的字符串前后的空格会对程序造成很大的危害,最常见的问题就是查询和统计错误。作为严谨的开发人员,我们应该主动进行处理。
逐个 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 过滤敏感信息
-------------------
思想火花,照亮世界
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架