缺少 HttpParameterBinding 和 ParameterBindingAttribute

Missing HttpParameterBinding and ParameterBindingAttribute

我正在使用日常构建在 ASP.NET vNext 中调查 Web Api。在 web api 2x 项目中,我在某些情况下使用 HttpParameterBinding 和 ParameterBindingAttribute(参见 http://bit.ly/1sxAxdk);但是,我似乎无法在 vNext 中找到任何一个。 Do/will这些类存在吗?如果没有,我有什么选择?

编辑 (1-22-15):

我希望能够将一个复杂的 JS 对象序列化为一个 JSON 字符串,将 JSON 字符串放在一个隐藏的表单字段中(比如 name="data"),提交表单,然后将我的参数绑定到服务器上的 JSON 对象。这永远不会由人来完成,而是由机器来完成。如果直接在请求正文中发送 JSON 而不是表单数据,我也希望这种相同的机制起作用。我还需要它来处理几种不同类型的对象。

我已经能够通过几种不同的方式在 Web Api 2.2 中完成此场景,包括自定义 ModelBinder;但是,我记得读过一篇 MSFT 博客 post,该博客建议使用 ModelBinder 进行查询字符串绑定,使用格式化程序进行请求正文,并使用 HttpParameterBinding 进行更一般的场景。在 ModelBinder ASP.NET 5 中读取请求主体是否可以,或者是否有更好的机制?如果是这样,那么案例结束,我将通过一些小的更改移植我的 ModelBinder。

我不确定 IInputFormatter 在这种情况下是否适合我。

有一个新的 [FromHeader] 属性允许您直接绑定到 http header 值,如果您需要的话。

https://github.com/aspnet/Mvc/issues/1671

https://github.com/aspnet/Mvc/search?utf8=%E2%9C%93&q=fromheader

这里有两种粗略的方法

方法一:

一种快速而肮脏的方法是从 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 这样你就永远不会真正阅读 body 自己,而 Form 只在它的类型时读取它表格.

这样做的缺点是 ApiExplorer 不会提供正确的详细信息(但我认为既然这是 none-standard 你无论如何都会在这里遇到麻烦)。

方法二

您也可以只使用 BodyModelBinder 中的代码并为上面的 Serializable 类型创建一个自定义活页夹,它首先尝试从表单中获取它,如果失败则尝试获取它来自 Body。 Dto class 在这种情况下是没有必要的。

这是一些伪代码

if (inputType is yourtype)
{
     if (request.Form["yourkey"] != null)
     {
         Use Json.Net to deserialize your object type
     }
     else
     {
         fall back to BodyModelBinder code
     }
}

通过这种方法,您可以使其成为通用的,ApiExplorer 会说绑定类型的方式是 unknown/custom(我们还没有决定这个术语 :))

注:

您可以使用 [ModelBinder(typeof(customBinder))] 属性来谨慎应用它,而不是注册模型绑定器。

这是 BodyModelBinder 代码的 link