【问题标题】:Wrong value binding for asp.net web API controller action paramtersasp.net Web API 控制器操作参数的错误值绑定
【发布时间】:2013-08-08 02:36:36
【问题描述】:

我有一个 asp.net web api 控制器操作 (RESTful),它接受 2 个字符串参数。这样的参数可以为空。 Web api 操作从 asp.net Razor 视图页面中的 AngularJS 代码(客户端 Javascript)中使用。

该 web api 操作的问题是案例 4(见下文)从未命中。具体来说,当 paramter1 以空字符串传递,而 paramter2 以非空字符串传递时,情况 4 应该运行。但是,在运行这种情况并使用调试器时,我发现 paramter1 的值绑定到 parameter2 的值,并且 parameter2 的值变为 null 或空。因此,该 web api 操作存在错误的数据绑定,我不知道如何解决。请帮忙。谢谢。

Web API 控制器操作如下所示:

        [HttpGet]
        [AllowAnonymous]
        public HttpResponseMessage GetProductByParamter1AndParameter2(string paramter1, string paramter2)
        {
            if (string.IsNullOrWhiteSpace(paramter1) && string.IsNullOrWhiteSpace(paramter2))
            {
                // case 1: do something 1 ...
            }
            else if (!string.IsNullOrWhiteSpace(paramter1) && !string.IsNullOrWhiteSpace(paramter2))
            {
                // case 2: do something 2 ...
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(paramter1) && string.IsNullOrWhiteSpace(paramter2))
                {
                    // case 3: do something 3 ...
                }
                else // when paramter1 is empty and paramter2 is not empty
                {
                    // case 4: do something 4 ... but this is never hit
            }
        }

该 Web API 控制器操作的自定义路由如下所示:

 config.Routes.MapHttpRoute(
                name: "ProductApi_GetProductByParamter1AndParameter2",
                routeTemplate: "api/ProductApi/GetProductByParamter1AndParameter2/{parameter1}/{parameter2}",
                defaults: new
                {
                    controller = "ProductApi",
                    action = "GetProductByParamter1AndParameter2",
                    parameter1 = "",
                    parameter2 = ""
                }
            );

在 cshtml 视图页面中,在客户端 AngularJS(Javascript 代码)上使用该 Web API,我正在编写如下代码:

myApp.factory('ListProductFactory', function ($http, $q) {

        return {
            getProducts: function (par1, par2) {

                var url = _baseUrl + '/ProductApi/GetProductByParamter1AndParameter2/' + par1 + '/' + par2;
                return $http({
                    method: 'GET',
                    url: url
                })
            }
        };
    });

【问题讨论】:

  • 您能否在调试器中验证您的参数输入是否正确?还是这个问题,某些逻辑阻止了 p1=null p2=notNull 的情况?
  • @MaxPRafferty。感谢您的回复。我使用 VS 2012 调试操作并将断点设置在控制器操作的 open { 括号中,因此我看到 2 个参数的值绑定是错误的。因此,案例 4 永远不会被击中。

标签: asp.net-mvc-4 angularjs asp.net-web-api


【解决方案1】:

在控制器上,您将“routeTemplate”设置为api/ProductApi/**GetSourceColumns**/{parameter1}/{parameter2},它应该是动作的名称GetProductByParamter1AndParameter2

定义为 /ProductApi/GetProductByParamter1AndParameter2/{parameter1}/{parameter2} 的 url 仍然到达已定义的路由,这甚至没有意义。

您可能已经阅读过这些内容,但如果您还没有阅读过,请查看这些解释 Web API 主要功能的链接

模型验证:http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

路由和操作选择:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

【讨论】:

  • 感谢您的指点。那是我的错字。我已经纠正了。但是,问题仍然存在。我会阅读那些文章。
【解决方案2】:

为了解决这个问题,我使用查询字符串方法而不是段(/)方法:

var url = _baseUrl + '/ProductApi/GetProductByParamter1AndParameter2?parameter1=' + par1 + '&parameter2=' + par2;

我花了 10 天的时间为自己找出答案。很痛苦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多