asp.net web api参数
翻译自: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参数的更多相关文章
- Parameter Binding in ASP.NET Web API(参数绑定)
Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...
- 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. 本文主要来讲解以下内容: ...
- jQuery Ajax传递数组到asp.net web api参数为空
前端: var files = []; files.push({ FileName: "1.jgp", Extension: ".jgp", FileType: ...
- 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解
概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- ASP.NET Web API 2 之参数验证
Ø 前言 目前 C# 比较流行使用 ASP.NET Web API 来承载 Web 接口,提供与客户端之间的数据交互,现在的版本已经是 2.0 了.既然是接口就少不了对输入参数的验证,所以本文主要探 ...
- 让ASP.NET Web API支持$format参数的方法
在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using Sys ...
- [转]让ASP.NET Web API支持$format参数的方法
本文转自:http://www.cnblogs.com/liuzhendong/p/4228592.html 在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数, ...
- asp.net web api [FromBody]参数
Using jQuery to POST [FromBody] parameters to Web API 时间2013-04-04 00:28:17 Encosia原文 http://encosia ...
随机推荐
- IP地址的分类——a,b,c 类是如何划分的【转】
ip分类已经是耳熟能详了.但是说的都比较繁琐,这里简述一下,便于以后复习. IP地址,一共分成了5类,范围分别如下: A类IP:从0.0.0.0 – 127.255.255.255,共有1677721 ...
- 斯诺克台球比赛规则 (Snooker)
斯诺克台球比赛规则 斯诺克(Snooker)的意思是“阻碍.障碍”,所以斯诺克台球有时也被称为障碍台球.此项运动使用的球桌长约3569毫米.宽1778毫米,台面四角以及两长边中心位置各有一个球洞,使用 ...
- QT的setwindowflags的属性总结
:setWindowFlags(Qt::CustomizeWindowHint);//设置窗口标题栏自定义 setWindowFlags(Qt::WindowMinimizeButtonHint);/ ...
- Java 设计模式笔记
0. 说明 转载 & 参考大部分内容 JAVA设计模式总结之23种设计模式 1. 什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...
- 阿里云 IOT 对接设备开发 C# 开发设备对接阿里云 IOT平台
一,创建阿里云 IOT 产品.设备 目前阿里云每月赠送 100 万条流量,可以免费使用基础版.高级版,开通后即可免费使用. 阿里云 IOT 平台地址 https://iot.console.aliyu ...
- 阿里八八Alpha阶段Scrum(3/12)
今日进度 叶文滔: 实现了悬浮按钮的拖动. 问题困难:第三方库调入不成功,多级悬浮按钮的实现仍未完成. 刘晓: 完成注册.修改密码的UI部分,创建了注册Activity,修改密码Activity. 问 ...
- 2-5 R语言基础 factor
#因子:分类数据#有序和无序#整数向量+标签label#Male/Female#常用于lm(),glm() > x <- factor(c("female"," ...
- 各种SQL查询技巧汇总 (转)
原文地址: https://blog.csdn.net/tim_phper/article/details/54963828 select select * from student; all 查询所 ...
- Python2.7-hashlib
hashlib模块,实现了支持多种不同哈希算法的接口,不同 hash 算法的构造函数就是算法名,返回的哈希对象都具有相同接口.哈希算法不是加密算法,所以下面提到的加密不是真的加密,因为真的加密需要能够 ...
- Android自定义布局的背景在多分辨率的情况下设置fill_parent时背景不能够横向全屏的问题解决
问题描述:最近做了一个自定义的控件LinearLayout就是公用的底部菜单条,在指定分辨率下(例如:480x800,480x854)下背景是正常的,但是当程序运行到非指定(默认)的分辨率下就不正常了 ...