【问题标题】:Web Api and AngularJsWeb API 和 AngularJs
【发布时间】:2014-08-03 05:28:15
【问题描述】:

直奔问题:

有一个 angularJs 控制器,它调用工厂内部定义的函数。 工厂函数调用接受“[FromBody]string”参数的 Api POST 操作。 问题正是在这里提出的。实际上,参数始终为空!而在工厂方法内部,它具有所需的值。下面是一段代码:

angularJs 控制器:

$scope.readText = function() {

        var element = document.getElementsByClassName('news-content');

        if (element[0] != undefined) {
            elementPureText = element[0].innerText;
        }

        dataFactory.createTextFile(elementPureText)
            .succes(function(data, status, headers, config) {

            }).error(function(data, status, headers, config) {

            });
    };

工厂代码:

philadelphiaApp.factory('dataFactory', ['$http', function ($httpt) {

var dataFactory = {};

dataFactory.createTextFile = function (text) {
    return $httpt.post('api/textmanager/textWriter', { '': text });
};

return dataFactory;

}]);

最后是 ApiController:

[HttpPost]
    [ActionName("TextWriter")]
    public HttpResponseMessage PostTextWriter([FromBody]string text)
    {
        if (String.IsNullOrEmpty(text) || text.Length == 0)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
        }

        if (!Directory.Exists(FileDirectory))
        {
            try
            {
                Directory.CreateDirectory(FileDirectory);
            }
            catch (Exception)
            {

                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
            }
        }

        try
        {
            File.WriteAllText(FileDirectory, text);
        }
        catch (Exception)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
        }

        return Request.CreateResponse(HttpStatusCode.OK, text);
    }

通过网络访问和搜索后,我遇到了很多提供解决方案的论坛和网站,但我还无法处理。我认为最好的是以下 URL:

http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

非常感谢您对此提供的任何帮助...

【问题讨论】:

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


    【解决方案1】:

    问题与数据的编码方式以及 WebAPI 如何在后端尝试反序列化有关。

    默认情况下,$http 将通过 content-type:application/json 传递所有 POST 请求,并尝试以这种方式对您的数据进行编码。您可以尝试将content-type 设置为text/plain 之类的东西,但是您需要一个自定义媒体格式化程序才能让WebAPI 能够处理它。

    您在这里阻力最小的路径是创建一个简单的请求对象,如下所示:

    public class TextWriterRequest
    {
        public String Text { get; set; }
    }
    

    然后修改您的方法以接受该对象作为输入。无需使用[FromBody],因为 WebAPI 默认会在 body 中查找复杂对象。

    public HttpResponseMessage PostTextWriter(TextWriterRequest text)
    

    然后您可以通过$http 服务确保您传递的数据与请求对象匹配:

    $http({
        method: 'POST',
        url: '/api/textmanager',
        data: { text: text }
    });
    

    这将在服务上正确反序列化,生活将再次美好。

    【讨论】:

    • 嗯.. 你的建议似乎是一个合理的解决方案,但我很遗憾地说,不,它不适用于我的代码......正如我正在开发一个示例应用程序并完全出来想法..我会从头开始创建一个新的解决方案,也许我可以弄清楚!
    • @AliAshoori - 这对我来说似乎很奇怪。主要是因为我在回答这个问题之前实际上创建了一个解决方案,只是为了确保它按预期工作。
    【解决方案2】:

    您正在发送一个对象,其中包含一个名为 ''(空字符串)的字段和您的文本值。但是,您的 webapi 后端需要一个字符串,而不是一个对象。无法将对象反序列化为字符串,所以会为null。

    您需要直接发送字符串,而不是将其填充到对象中。像这样:

    return $httpt.post('api/textmanager/textWriter', text);
    

    【讨论】:

    • 谢谢我之前做过,但仍然是 NULL 值。实际上,我按照上述 URL 中的建议发送了对象(在我的问题中)
    【解决方案3】:

    其实经过几天的努力,我找到了答案……而且看起来很容易;只需在 web api 客户端调用中添加 Content-Type: application/json 就可以了! 但感谢那些提供解决方案的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多