模型绑定时对客户端传过来的数据做处理的几种方式

有时我们从客户端获取来的数据。不一定就是我们先要的,需要做一些处理 。这里我们以一个model的属性需要做处理为例子。

这里说5种解决方法。

model:

public class MyModel
{
   public string Encrypt  { get; set; }

   public string Lala { get; set; }
}

Controller:

    public class HomeController : Controller
    {
        public void Test(MyModel myModel)
        {

        }
    }

第一种方式:

在model里做处理,很简单也很方便,很好理解直接上代码

namespace WebApplication
{
    public class MyModel
    {
        private string encryptValue = string.Empty;
        public string Encrypt
        {
            set { encryptValue = value; }
            get
            {
                return encryptValue + "uuu";
            }
        }
        public string Lala { get; set; }
    }
}

第二种方式:
实现一个默认的模型绑定重写GetPropertyValue方法。对反回的属性值处理。PS:GetPropertyValue—使用指定的控制器上下文、绑定上下文、属性描述符和属性联编程序来返回属性值。

首选我们要创建一个特性,用来标记需要做处理的属性

model:

namespace WebApplication
{
    public class MyModel
    {
        [Test]
        public string Encrypt { get; set; }

        public string Lala { get; set; }
    }
}

TestAttribute:用来标记的特性

namespace WebApplication
{
    [AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]
    public class TestAttribute:Attribute
    {

    }
}

MyModelBinder:实现一个默认的模型绑定

调用父类方法获取属性值,如果满足条件,类型条件和标记条件,就返回自定义的值,否者返回原值

namespace WebApplication
{
    public class MyModelBinder:DefaultModelBinder
    {
        protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
        {
            var value = base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
            if(value is string &&propertyDescriptor.Attributes[typeof(TestAttribute)]!=null)
            {
                return "我对值做了处理";
            }
            return value;
        }
    }
}

添加默认模型绑定

namespace WebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //自定义默认模型绑定
            ModelBinders.Binders.DefaultBinder = new MyModelBinder();
        }
    }
}

第三种方式:
实现一个自定义值提供器,ContainsPrefix方法判断是否满足条件,myModel:Controller里Action模型参数名

GetValue方式返回ValueProviderResult类型的结果,供模型绑定时使用

namespace WebApplication
{
    public class MyValueProvider : IValueProvider
    {
        public MyValueProvider(string value)
        {
            this.Value = value;
        }
        private string Value { get; set; }
        public bool ContainsPrefix(string prefix)
        {
            if(prefix=="myModel")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public ValueProviderResult GetValue(string key)
        {
            MyModel model = new MyModel() { Encrypt = this.Value + "ooo" };
            return new ValueProviderResult(
                model,
                model.ToString(),
                CultureInfo.CurrentCulture);
        }
    }
}

实现一个值提供器工厂:用来提供值提供器

namespace WebApplication
{
    public class MyValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            string value = controllerContext.HttpContext.Request["Encrypt"];
            return new MyValueProvider(value);
        }
    }
}

添加值提供器工厂

namespace WebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //添加一个值提供器工厂
            ValueProviderFactories.Factories.Add(new MyValueProviderFactory());
        }
    }
}

第四种方式:
实现一个自定义值提供器工厂,myModel:Controller里Action模型参数名

把myModel作为Encrypt的前缀当做NameValueCollection的key保存起来,作为NameValueCollectionValueProvider的参数

模型是树状的,但是NameValueCollection是平面的,所以以添加前缀的方式保存数据。

namespace WebApplication
{
    public class MyValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            var value = controllerContext.HttpContext.Request["Encrypt"];
            if (value == null)
                return null;
            NameValueCollection nameValueCollection = new NameValueCollection();
            nameValueCollection.Add("myModel.Encrypt", "aaa" + value);
            return new NameValueCollectionValueProvider(nameValueCollection, CultureInfo.InvariantCulture);
        }
    }
}

添加值提供器工厂

namespace WebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //添加一个值提供器工厂
            ValueProviderFactories.Factories.Add(new MyValueProviderFactory());
        }
    }
}

第五种方式:

实现一个自定义模型绑定,bindingContext中获取当前的值,处理后返回一个model

namespace WebApplication
{
    public class MyBinder:IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var value = bindingContext.ValueProvider.GetValue("Encrypt").AttemptedValue;
            return new MyModel { Encrypt = value + "ooxx" };
        }
    }
}

使用ModelBinder特性指定模型绑定

namespace WebApplication.Controllers
{
    public class HomeController : Controller
    {
        public void Test([ModelBinder(typeof(MyBinder))] MyModel myModel)
        {

        }
    }
}

学习和进步是一辈的事情,我们都因该不断努力去看一个更大更不一样的世界。

愿2016年,可以过的开开心心的,少些烦恼,做更优秀的项目和产品

时间: 2024-10-12 11:31:45

模型绑定时对客户端传过来的数据做处理的几种方式的相关文章

CXF3.0.4客户端调用Web service来获取服务的三种方式

服务端的代码请看我的另一篇文章:点击打开链接 首先必须要有一个可用的WSDL服务地址,这个地址有我们需要调用的方法,将地址复制到浏览器地址栏,看测试能否通过. 方式一: 配置CXF环境变量,用wsdl2java工具自动产生代码.项目结构目录如下: 其中com.yq.webservice下面的所有的java类都是wsdl2java工具自动产生的. <span style="font-size:18px;"><span style="white-space:pr

MVC ,Action方法传数据给视图有几种方式?

//---------------------------------控制器向视图传递数据 public ActionResult TransData() { //1.ViewBag ViewBag.Hello = "hello world---"; //2.ViewData ViewData["Think"] = "C#"; //3.TempData TempData["TempHH"] = "我是tempda&q

ASP.NET MVC学习三-数据传递之模型绑定

一:简单的模型绑定 在ASP.NET MVC中是模型绑定来解析客户端传过来的数据的,简单的来说就更近一步来封装了获得数据的手段,让用户更方便的来获取数据了 我们来简单做一个例子 public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(string username) { ViewData["username"] = username; return View(); } 这里我

ASP.NET MVC5 学习系列之模型绑定

一.理解 Model Binding Model Binding(模型绑定) 是 HTTP 请求和 Action 方法之间的桥梁,它根据 Action 方法中的 Model 类型创建 .NET 对象,并将 HTTP 请求数据经过转换赋给该对象. 为了理解 Model Binding 如何工作,我们来做个简单的Demo,像往常一样创建一个 MVC 应用程序,添加一个 HomeController,修改其中的 Index 方法如下: public ActionResult Index(int id

模型绑定(Model Binding)

模型绑定是值用浏览器以HTTP请求方式发送数据来创建.NET对象的过程.(负责生成适当的动作方法参数值) 动作调用器(Action Invoker):调用控制器的动作方法的组件,负责在调用动作方法之前获取动作方法的参数值. 默认的动作调用器(ControllerActionInvoker)依赖于模型绑定器,而模型绑定器(Model Binder)是有IModelBinder接口定义的. public interface IModelBinder { object BindModel(Contro

第22章 模型绑定

模型绑定(Model Binding)是指用浏览器以HTTP请求方式发送的数据来创建.NET对象的过程. 动作方法的参数依赖于模型绑定过程(通过模型绑定器来实现).利用整个HTTP请求所携带的数据(用户在表单中输入的数据.路由数据.请求URL中的查询字符串.请求中上传的文件)构造动作方法所需要参数对象的过程. 模型绑定过程(模型绑定器要做的事): 1.检测确认目标对象(要创建的对象,指动作方法的参数)的名称和类型:(动作方法参数的名称和类型) 2.通过对象名称查找数据源(请求),并找到可用数据(

ASP.NET 的模型绑定(ModelBinding)

ModelBinding :用浏览器以HTTP请求方式发生数据来创建.NET对象的过程. 一.理解模型绑定. 1.模型绑定器是由IModelBinder接口定义的.下面是此接口的定义 namespace System.Web.Mvc { public interface IModelBinder { object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext); } } 2.在一

ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)

前面文章介绍了ASP.NET MVC中的模型绑定和验证功能,本着ASP.NET MVC没有魔法的精神,本章内容将从代码的角度对ASP.NET MVC如何完成模型的绑定和验证进行分析,已了解其原理. 本文的主要内容有: ● ModelBinder ● ValuePrivoder ● ModelMetadata ● 简单模型与复杂模型 ● 小结 ModelBinder ModelBinder是ASP. NET MVC用于模型绑定的核心组件,所有的ModelBinder都实现了IModelBinder

【转】DataGridView绑定数据源的几种方式

第一种:DataSet ds=new DataSet (); this.dataGridView1.DataSource=ds.Table[0]; 第二种:DataTable dt=new DataTable(); this.dataGridView1.DataSource=dt; 第三种:DataSet ds=new DataSet (); this.dataGridView1.DataSource = ds.Tables["表名"]; 第四种:DataSet ds=new Data