翻译自:http://www.c-sharpcorner.com/article/parameter-binding-in-asp-net-web-api/

主要自己学习下,说是翻译,主要是把文章的意思记录下,下面进入正题

web api 对于一般的基本类型(primitive type)(bool,int ,double,log,timespan,datetime,guid,string)直接从url读取,对于复杂类型,web api从请求的body获取,需要使用media type。

对于这个api:

Public HttpResponseMessage Put(int id, Employee employee)
{


}

web api 从url中获取id类型,从body中获取employee类型。

当然这是默认情况,我们可以强制web api通过fromurl和frombody特性从url或者从body获取。

fromuri 特性

public class TestData
{
public string Name
{
get;
set;
}
public int Id
{
get;
set;
}
}
public HttpResponseMessage Get([FromUri] TestData data)
{……
return Request.CreateResponse(HttpStatusCode.OK, true);
}

这样就可以强制从url获取参数,web api生成TestData类。url:http://localhost:24367/api/Employee?Name=Jignesh&Id=10

可以测试下,这样没任何问题。

fromBody 特性

[HttpPost]
public HttpResponseMessage Post([FromBody] string name)
{
……
return Request.CreateResponse(HttpStatusCode.OK, true);
}

对于这个api,调用时要设置content type:“application/json”

这样设置可以成功调用。

这样就不成功了,web api 支持json string,不支持json 对象,因此只允许在body中有一个参数。

Type converters


可以使用类型转换的方法,将请求的数据按字符串处理,处理过程如下:

namespace WebAPITest
{
using System;
using System.ComponentModel;
using System.Globalization;
public class TestTypeConverter: TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
returntrue;
}
returnbase.CanConvertFrom(context, sourceType);
} public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
TestData data;
if (TestData.TryParse((string) value, out data))
{
return data;
}
}
return base.ConvertFrom(context, culture, value);
}
}
}
namespaceWebAPITest
{
using System.ComponentModel;
[TypeConverter(typeof(TestTypeConverter))]
public class TestData
{
public string Name
{
get;
set;
}
public int Id
{
get;
set;
} public static bool TryParse(string s, outTestData result)
{
result = null; var parts = s.Split(',');
if (parts.Length != )
{
return false;
} int id;
string name = parts[];
if (int.TryParse(parts[], out id))
{
result = newTestData()
{
Id = id, Name = name
};
return true;
}
return false;
}
}
}

这样就可以不用写from url这样调用: http://localhost:24367/api/Employee?data=10,jignesh%20trivedi

public HttpResponseMessage Get(TestData data)
{
……
return Request.CreateResponse(HttpStatusCode.OK, true);
}

Model Binder

另外一种处理参数的方法,实现IModelBinder 接口,只用实现一个方法BindModel,下面的代码从路由中读取raw data,将其转换成TestData,实例是一个简单类型转换,当然Model binder不限于简单类型:

namespace WebAPITest
{
using System;
using System.Web.Http.Controllers;
using System.Web.Http.ModelBinding;
using System.Web.Http.ValueProviders;
public class CustomModelBinder: IModelBinder
{
static CustomModelBinder()
{ } public bool BindModel(HttpActionContextactionContext, ModelBindingContextbindingContext)
{
if (bindingContext.ModelType != typeof(TestData))
{
return false;
} ValueProviderResult val = bindingContext.ValueProvider.GetValue(
bindingContext.ModelName);
if (val == null)
{
return false;
} string key = val.RawValue as string;
if (key == null)
{
bindingContext.ModelState.AddModelError(
bindingContext.ModelName, "Wrong value type");
returnfalse;
}
TestData result = newTestData(); var data = key.Split(newchar[]
{
','
});
if (data.Length > )
{
result.Id = Convert.ToInt32(data[]);
result.Name = data[];
bindingContext.Model = result;
return true;
} bindingContext.ModelState.AddModelError(
bindingContext.ModelName, "Cannot convert value to TestData");
return false;
}
}
}

另外需要注册这个binder,我们需要在configuration中生成一个 model-binder provider 。这里使用自带的provider:SimpleModelBinderProvider

namespace WebAPITest
{
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.ModelBinding.Binders;
public static class WebApiConfig
{
public static void Register(HttpConfigurationconfig)
{
var provider = newSimpleModelBinderProvider(
typeof(TestData), newCustomModelBinder());
config.Services.Insert(typeof(ModelBinderProvider), , provider); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new
{
id = RouteParameter.Optional
});
}
}
}

调用这个url:URI: http://localhost:24367/api/Employee?data=10,jignesh%20trivedi,有多种方法使用这个Model binder。在参数上使用特性:

public HttpResponseMessage Get([ModelBinder(typeof(CustomModelBinder))] TestData data)  

{
……
return Request.CreateResponse(HttpStatusCode.OK, true);
}

另外可以在类上使用这个特性:

[ModelBinder(typeof(CustomModelBinder))]
public class TestData
{
//......
}

完了。。。。。

asp.net web api参数的更多相关文章

  1. Parameter Binding in ASP.NET Web API(参数绑定)

    Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...

  2. Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)

    导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html. 本文主要来讲解以下内容: ...

  3. jQuery Ajax传递数组到asp.net web api参数为空

    前端: var files = []; files.push({ FileName: "1.jgp", Extension: ".jgp", FileType: ...

  4. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  5. ASP.NET Web API中的参数绑定总结

    ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...

  6. ASP.NET Web API 2 之参数验证

    Ø  前言 目前 C# 比较流行使用 ASP.NET Web API 来承载 Web 接口,提供与客户端之间的数据交互,现在的版本已经是 2.0 了.既然是接口就少不了对输入参数的验证,所以本文主要探 ...

  7. 让ASP.NET Web API支持$format参数的方法

    在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using Sys ...

  8. [转]让ASP.NET Web API支持$format参数的方法

    本文转自:http://www.cnblogs.com/liuzhendong/p/4228592.html 在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数, ...

  9. asp.net web api [FromBody]参数

    Using jQuery to POST [FromBody] parameters to Web API 时间2013-04-04 00:28:17 Encosia原文 http://encosia ...

随机推荐

  1. Python实例---模拟微信网页登录(day2)

    第三步: 实现长轮询访问服务器---day2代码 settings.py """ Django settings for weixin project. Generate ...

  2. 李嘉诚 《Are you ready》

    当你们梦想着为伟大成功的时候,你有没有刻苦的准备? 当你们有野心作领袖的时候,你有没有服务于人的谦恭? 我们常常都想有所获得,但我们有没有付出的情操? 我们都希望别人听到自己的话,我们有没有耐性聆听别 ...

  3. 拉格朗日插值和牛顿插值 matlab

    1. 已知函数在下列各点的值为   0.2 0.4 0.6 0.8 1.0   0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...

  4. Windows Phone 8 获取与监听网络连接状态(转)

    原文地址:http://www.cnblogs.com/sonic1abc/archive/2013/04/02/2995196.html 现在的只能手机对网络的依赖程度都很高,尤其是新闻.微博.音乐 ...

  5. spa(单页面应用)的优缺点[转]

    优点:spa(单页面应用)1.用户体验好.快,内容的改变不需要重新加载整个页面,避免了不必要的跳转和重复渲染.2.基于上面一点,SPA相对对服务器压力小.缺点:1: seo 不利于搜索引擎优化2: 初 ...

  6. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...

  7. 2-5 R语言基础 factor

    #因子:分类数据#有序和无序#整数向量+标签label#Male/Female#常用于lm(),glm() > x <- factor(c("female"," ...

  8. 2-4 R语言基础 列表

    #列表list > l1 <- list("a",2,10L,3+4i,TRUE) #每个元素没有名字> l1[[1]][1] "a" [[2 ...

  9. BZOJ4300:绝世好题(DP)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  10. redis命令手册

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...