[转载]ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串

[转载]ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串 – 鹤冲天 – 博客园.

用户输入的字符串前后的空格会对程序造成很大的危害,最常见的问题就是查询和统计错误。作为严谨的开发人员,我们应该主动进行处理。

逐个 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 优秀的设计和架构。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏