缺少 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。
我正在使用日常构建在 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。