缺少HttpParameterBinding和ParameterBindingAttribute

时间:2015-01-20 16:28:25

标签: asp.net-web-api asp.net-core

我正在使用每日构建调查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是否适用于我。

2 个答案:

答案 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)

这是两种粗略的方法

方法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不会提供正确的细节(但我认为,因为这是非标准的,所以无论如何你都会遇到麻烦。)

方法2

您也可以使用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