翻译自: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. ndk的注意事项

    从开源网站下载的源码,需要自己编译c源码成so类库.当时用Android studio 运行总是报错"finished with non-zero exit value 2"报错定 ...

  2. Objects聚合分组,统计结果个数(Count)

    参考:http://python.usyiyi.cn/django/topics/db/aggregation.html from django.db.models import Count toda ...

  3. http的断点续传

    要实现断点续传的功能,通常都需要客户端记录下当前的下载进度,并在需要续传的时候通知服务端本次需要下载的内容片段. HTTP1.1协议(RFC2616)中定义了断点续传相关的HTTP头 Range和Co ...

  4. It’s Time To Think Linq

    动机 如果你有以下迷惑,你应该看看这篇文章 你想办法找到所有与GameObject.FindGameObjectsWithTag的变换(),而不是游戏本身的对象 你需要操作,排序和更改列表和数组的类型 ...

  5. linux正则表达式(基础正则表达式+扩展正则表达式)

    正则表达式应用非常广泛,例如:php,Python,java等,但在linux中最常用的正则表达式的命令就是grep(egrep),sed,awk等,换句话 说linux三剑客要想能工作的更高效,就一 ...

  6. 一、JSP九大内置对象 二、JAVAEE三层架构和MVC设计模式 三、Ajax

    一.JSP九大内置对象###<1>概念 不需要预先申明和定义,可以直接在jsp代码中直接使用 在JSP转换成Servlet之后,九大对象在Servlet中的service方法中对其进行定义 ...

  7. apk静态注射[转]-未实践

    原文:http://free0coding.iteye.com/blog/1684263 1.将需要注入的代码块打包成jar1,释放一个公共类的静态方法a  2.反编译apk得到smali文件,在适当 ...

  8. 彻底理解lib和dll

    转自:http://www.cppblog.com/amazon/archive/2009/09/04/95318.html 两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口 ...

  9. Asp.net中DataTable的排序功能

    DataTable里的数据,如果是从数据库中取得的数据,我们可以用order by排序,而从excel表格取得的数据,就需要自己进行操作了. 例如,Dt_Data2是读取Excel表格取到的数据 Da ...

  10. python 安装opencv 安装pycocotools

    pip3 install opencv-python https://blog.csdn.net/lsh894609937/article/details/72841359 pip3 install  ...