【问题标题】:Angular 2 post data is null in asp.net MVC 6Angular 2 发布数据在 asp.net MVC 6 中为空
【发布时间】:2016-03-15 20:13:59
【问题描述】:

目前我正在使用 Angular 2 Beta-9 和 Asp.Net MVC 6。 我正在尝试创建一个简单的联系表格作为测试。问题是我的表单数据似乎没有传递到服务器,而在 Angular 端似乎一切正常。

contact.ts

/// <reference path="../node_modules/angular2/typings/browser.d.ts" />

import {Component, View} from 'angular2/core';
import {NgForm}    from 'angular2/common';
import {bootstrap} from 'angular2/platform/browser';
import {Http, Headers, HTTP_PROVIDERS} from 'angular2/http';

@Component({
    selector: 'contact',
    bindings: [ContactComponent],
    viewProviders: [HTTP_PROVIDERS],
    templateUrl: '/angular/contact'
})

export class ContactComponent {
    http = undefined;
    contact = {};

    constructor(http: Http) {
        this.http = http;
    }

    onSubmit() {
        this.http.post('/contact/send', JSON.stringify(this.contact), new Headers({ 'Content-Type': 'application/json' })).subscribe();
    }
}

bootstrap(ContactComponent);

Contact.cshtml

<form #f="ngForm" (ngSubmit)="onSubmit(contact)">
        <div>
            <div class="form-group">
                <label for="name">Name</label>
                <input type="text" [(ngModel)]="contact.Name" class="form-control text-input" id="name" placeholder="Name" />
            </div>
            <div class="form-group">
                <label for="email">E-mail</label>
                <input type="email" [(ngModel)]="contact.Email" class="form-control text-input" id="email" placeholder="E-mail" />
            </div>
        </div>
        <div>
            <div class="form-group">
                <label for="subject">Subject</label>
                <input type="text" [(ngModel)]="contact.Subject" class="form-control text-input" id="subject" placeholder="Subject" />
            </div>
        </div>
        <div>
            <div class="form-group">
                <label for="message">Bericht</label>
                <textarea type="text" [(ngModel)]="contact.Message" class="form-control" id="message" placeholder="Message"></textarea>
            </div>
        </div>
        <div>
            <div>
                <button type="submit" class="btn btn-success">Send</button>
            </div>
        </div>
    </form>

ContactController.cs

[HttpPost]
public IActionResult SendContact([FromBody]ContactVm contact)
{
    //do something
}

ContactVm.cs

public class ContactVm
    {
        [Required]
        [DataType(DataType.Text)]
        public string Name { get; set; }
        [Required]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
        [Required]
        [DataType(DataType.Text)]
        public string Subject { get; set; }
        [Required]
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
    }

我看不到或发现我做错了什么。在 http.post 之前,this.contact 已按应有的方式填写,但一旦到达服务器,它就是 null。

更新

发现Request.Form抛出如下错误:

Incorrect Content-Type: text/plain;charset=UTF-8

【问题讨论】:

  • 能否添加/angular/contact模板,联系人变量绑定是否正确..
  • 添加了我正在使用控制器的模板和联系人模型。虽然我认为视图没问题,因为我在调试过程中注意到所有内容都正确传递给了 Post 函数。
  • 您是否按照我的建议尝试了以下答案?
  • @JeffreyRosselle 您是否查看了正在发送的请求是那里的属性,它只是没有模型绑定?您是否尝试过显式绑定名称而不是 [(ngModel)]="contact.Name" name="contact.Name"
  • 你可以试试this.http.post('/contact/send', JSON.stringify({ contact: this.contact}), new Headers({ 'Content-Type': 'application/json' }))

标签: c# typescript angular asp.net-core-mvc


【解决方案1】:

根据我的发现,如果 MVC 无法强制将您发布的值放入参数中,它将“静默失败”。

所以,当我在开发时,我使用了“对象”——这可以确保我获得所有帖子。然后我微调它以引用正确的对象。

另外,我发现(在我使用的 Angular 6 中)你绝对不需要 JSON.stringify 对象...查看 Chome Inspect 选项卡,在 POST 中,然后是 Preview,它会给你一些失败的细节......

【讨论】:

  • 关于 JSON.stringify 的更正,我想我在它仍处于测试阶段时发表了这篇文章,出于某种原因我需要对其进行字符串化。从那以后它一直在更新,我把它删除了。
【解决方案2】:
let headers = new Headers({ 'Content-Type': 'application/json'});

this.http.post('/contact/send',JSON.stringify(this.contact),{ headers: headers })
         .subscribe(...);

服务器端。

[HttpPost]
public IActionResult SendContact(ContactVm contact)
{
    //do something
}

如果它不起作用,请参阅下面的选定答案。

【讨论】:

  • 我检查了链接,当我使用“URLSearchParams()”对象时,它终于起作用了。虽然它对我来说是固定的,但我想找到一个解决方案,我不必将我的对象映射到 URLSearchParams。
  • 你应该接受它作为答案,这样当其他用户来到这篇文章时可能会得到正确的方向......顺便说一句,很高兴它对你有所帮助。
【解决方案3】:

试试这个:

getJsonHeader(): Headers {
        var headers = new Headers();
        headers.append('Content-Type', 'application/json; charset=utf-8');
        return headers;
    }

   onSubmit() {
        this.http.post('/contact/send', JSON.stringify(this.contact), { headers: this.getJsonHeader() }).subscribe();
    }

【讨论】:

    【解决方案4】:

    我认为你不需要 JSON.stringify:

    this.http.post('/contact/send', this.contact, new Headers({ 'Content-Type': 'application/json' })).subscribe();

    这更正了我的问题 HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多