我正在使用每日构建调查ASP.NET vNext中的Web Api。在web api 2x项目中,我在某些情况下使用HttpParameterBinding和ParameterBindingAttribute(参见http://bit.ly/1sxAxdk);但是,我似乎无法在vNext中找到。这些类是否存在?如果没有,我的替代方案是什么?
编辑(1-22-15):
我希望能够将复杂的JS对象序列化为JSON字符串,将JSON字符串放在隐藏的表单字段中(比如name =“data”),提交表单,然后将我的参数绑定到该JSON对象在服务器上。这绝不会由人类完成,而是由机器完成。如果直接在请求体中发送JSON而不是表单数据,我也希望这种机制能够工作。我还需要它来处理几种不同类型的对象。
我已经能够通过几种不同的方式在Web Api 2.2中完成这个场景,包括自定义的ModelBinder;但是,我记得读过一篇MSFT博客文章,建议使用ModelBinder进行查询字符串绑定,请求体的格式化程序,以及HttpParameterBinding用于更一般的场景。是否可以在ModelBinder ASP.NET 5中读取请求主体,或者有更好的机制吗?如果是这样,那么关闭案例,我将通过一些小的改动来移植我的ModelBinder。
在这种情况下,我不确定IInputFormatter是否适用于我。
答案 0 :(得分:1)
有一个新的[FromHeader]属性允许您直接绑定到http标头值,如果这是你需要的。
https://github.com/aspnet/Mvc/issues/1671
https://github.com/aspnet/Mvc/search?utf8=%E2%9C%93&q=fromheader
答案 1 :(得分:1)
快速而肮脏的方法是从Dto模型开始
public class Dto
{
public Serializable Result { get; set; }
public Serializable FromForm
{
get { return Result; }
set { Result = value; }
}
[FromBody]
public Serializable FromBody
{
get { return Result; }
set { Result = value; }
}
}
public class Serializable
{
}
动作方法
public IActionResult DoSomething(Dto dto)
{
// Do something with Dto.Result
}
然后为Serializable编写一个自定义模型绑定器,它只与Request.Form
一起使用,这样你就不会自己实际读取正文,Form
只读取它的类型为Form。
这方面的缺点是ApiExplorer不会提供正确的细节(但我认为,因为这是非标准的,所以无论如何你都会遇到麻烦。)
您也可以使用BodyModelBinder
中的代码并为上面的Serializable
类型创建自定义绑定器,首先尝试从表单中获取它,如果失败则尝试从表单获取它身体。在这种情况下,Dto
类不是必需的。
这是一些伪代码
if (inputType is yourtype)
{
if (request.Form["yourkey"] != null)
{
Use Json.Net to deserialize your object type
}
else
{
fall back to BodyModelBinder code
}
}
使用这种方法你可以使它成为通用的,ApiExplorer会说绑定类型的方式是未知/自定义(我们尚未决定该术语:))
注意:强>
您可以使用[ModelBinder(typeof(customBinder))]属性谨慎地应用它来代替注册模型绑定器。
以下是BodyModelBinder
代码的link。