【问题标题】:POST request from Angular 2 to ASP.net Core doesn't work. Null value on server side从 Angular 2 到 ASP.net Core 的 POST 请求不起作用。服务器端的空值
【发布时间】:2016-08-16 19:55:55
【问题描述】:

后端,ASP.net Core API:

[Produces("application/json")]
    [Route("api/[controller]")]
    public class StoriesController : Controller
    {
        public static List<Story> STORIES = new List<Story>
            {
                new Story
                {
                    content = "Some really interesting story about dog",
                    timeOfAdding = new DateTime(2016, 8, 26),
                    numberOfViews = 11
                },
                new Story
                {
                    content = "Even cooler story about clown",
                    timeOfAdding = new DateTime(2016, 9, 26),
                    numberOfViews = 11
                },
                new Story
                {
                    content = "And some not cool story",
                    timeOfAdding = new DateTime(2016, 10, 26),
                    numberOfViews = 11
                }
            };

        // POST api/values
        [HttpPost]
        public void Post([FromBody]string value)
        {
            Story story = new Story
            {
                content = value,
                timeOfAdding = DateTime.Now,
                numberOfViews = 0
            };
            STORIES.Add(story);
        }
    }

TypeScript 函数:

add(content: string): Observable<Story> {
        let body = JSON.stringify({ "value": content });
        //let body = { "value": content };
        let headers = new Headers({ 'Content-Type': 'application/json' });
        let options = new RequestOptions({ headers: headers});

        return this.http.post(this.heroesUrl, body, options)
            .map(this.extractData)
            .catch(this.handleError);
    }

发送的参数(在 Firefox 控制台中看到):

value = null 在 Visual Studio 2015 调试器中

怎么了?我已经尝试了我在互联网上找到的所有内容:添加/删除标题、删除 JSON.stringify、添加/删除 [FromBody] 属性。结果每次都一样。

【问题讨论】:

    标签: c# asp.net angularjs angular


    【解决方案1】:

    由于您将值作为 JSON 传递(如屏幕截图所示),因此您应该正确使用模型绑定并使用正确的类而不是字符串输入:

    public class StoryAddRequest
    {
        public string Value { get; set; }
    }
    

    然后您可以在控制器中使用它:

    // POST api/values
    [HttpPost]
    public void Post([FromBody] StoryAddRequest request)
    {
        if (request != null)
        {
            Story story = new Story
            {
                content = request.Value,
                timeOfAdding = DateTime.Now,
                numberOfViews = 0
            };
            STORIES.Add(story);
        }
    }
    

    来自documentation

    请求数据可以有多种格式,包括 JSON、XML 和许多其他格式。当您使用[FromBody] 属性指示您希望将参数绑定到请求正文中的数据时,MVC 使用一组配置的格式化程序来根据其内容类型处理请求数据。默认情况下,MVC 包含一个用于处理 JSON 数据的 JsonInputFormatter 类,但您可以添加其他格式化程序来处理 XML 和其他自定义格式。

    【讨论】:

    • 如果我只想传递一个字符串参数,我需要为他创建单独的类吗? AFAIK 字符串本身就是一个类,那么为什么传递字符串不起作用?
    • 你在那里传递 JSON,而不仅仅是一个字符串。
    • 所以内部 JSON 反序列化器不能仅仅将 { "value": "yyyyy" } 反序列化为 String 类。
    猜你喜欢
    • 2017-07-31
    • 2018-08-06
    • 2019-04-30
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2018-11-23
    相关资源
    最近更新 更多