【问题标题】:Missing HttpParameterBinding and ParameterBindingAttribute缺少 HttpParameterBinding 和 ParameterBindingAttribute
【发布时间】:2015-03-18 23:30:58
【问题描述】:

我正在使用日常构建调查 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 在这种情况下是否适合我。

【问题讨论】:

  • 没有更多的 ParameterBindingAttribute。您可以创建自定义模型绑定器并注册它。或者在您的情况下,您可以只使用 [FromForm]。如果您可以在您的问题中提供更详细的示例,我可能会帮助您提供实际示例。我们称之为贪婪模型绑定器的示例可以在以下位置找到:github.com/aspnet/Mvc/blob/dev/src/… 并且注册就像 services.SetupOptions(options => options.ModelBinders.Insert(0, new YourCustomBinder()); 一样简单
  • 谢谢一晒!我已经更新了我原来的问题。
  • IInputFormatter 可以正常工作。我发布了完整的答案。

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


【解决方案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))] 属性谨慎地应用它,而不是注册模型绑定器。

这是linkBodyModelBinder 代码。

【讨论】:

  • 谢谢,方法 #2 正是我想要的!
【解决方案2】:

有一个新的 [FromHeader] 属性允许您直接绑定到 http 标头值(如果需要)。

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

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

【讨论】:

  • 谢谢托马斯,但我实际上需要一些不同的东西。我想我应该澄清一下,我会编辑我原来的问题。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2011-12-10
  • 2012-04-27
  • 2018-01-15
相关资源
最近更新 更多