【问题标题】:Equivalent of [Bind(Prefix = "principalId")] in MVC4 Web Api?相当于 MVC4 Web Api 中的 [Bind(Prefix = "principalId")]?
【发布时间】:2012-05-07 17:48:37
【问题描述】:

背景:

在 MVC3 中,我使用以下语法来指定自定义 Action 参数名称:

public ActionResult ActionName([Bind(Prefix = "principalID")] int userID,
                               [Bind(Prefix = "dependentID")] long applicationID)

这个动作的路由定义如下(ActionNameConstraint是自定义IRouteConstraint):

routes.MapHttpRoute(
    "DependantAction",
    "{controller}/{principalID}/{action}/{dependentID}",
    new {controller = @"[^0-9]+", action = ActionNameConstraint.Instance, dependentID = RouteParameter.Optional}
    );

问题:

BindAttribute 是一个 System.Web.Mvc 类。 Web Api 中是否有等效的 this(参数绑定)?

当然,如果有其他解决方案可以达到同样的效果,我很想听听!

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing


    【解决方案1】:

    我知道在 WebAPI 中你只是使用特殊的控制器类基和特殊的动作名称,但毕竟它们是控制器和动作。

    你试过了还是不行?快速浏览一下这篇文章似乎表明模型绑定(虽然不是特定属性)应该正常工作:

    http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

    编辑:

    有人说这应该只与 MVC 一起工作,并否决了答案。给你,更多参考:

    【讨论】:

    • 我确实看过那篇文章,它并没有真正达到同样的意图 - 这篇文章主要涉及模型绑定(我的大部分搜索实际上都导致了关于模型绑定的结果)
    • ASP.NET Web API 没有内置BindAttribute 功能。动作参数绑定是通过我的Web API 的模型绑定和格式化功能完成的。因此,它不仅仅是模型粘合剂。这里的另一个提示是:不要将 System.Web.Mvc 命名空间下的任何内容与 ASP.NET Web API 一起使用。 99% 的情况下,如果你这样做,你会遇到麻烦。
    【解决方案2】:

    您可以使用System.Web.Http.FromUriAttribute 属性来指定用于模型绑定的参数名称。

    public ActionResult ActionName(
                        [FromUri(Name = "principalID.userID")] int userID,
                        [FromUri(Name= "dependentID.applicationID")] long applicationID
                        )
    

    FromUri 告诉模型绑定检查查询字符串和请求的RouteData

    【讨论】:

    • 不幸的是,这种方法只适用于内含物。如果您想指定排除项,请自行决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 1970-01-01
    • 2020-08-18
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多