【问题标题】:How to send data to the ASP.NET Core MVC controller in C#?如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?
【发布时间】:2020-10-21 05:20:27
【问题描述】:

我正在尝试将数据从我的 Javascript 发送到我的 post 方法控制器。我将淘汰赛作为我从 Javascript 绑定到我的视图的方法。

这是我的控制器,这是 convocationData 为空的地方

public async Task<ActionResult> CreateConvocation(string convocationData)
{
    string baseUrl = "http://localhost:8080";
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(baseUrl);

这是我尝试使用 jQuery 调用该方法的方式:

var tmpSession = self.addSession();
var tmpDescription = self.addDesc();
var convocationData = {
            sessionCode: tmpSession,
            description: tmpDescription
        };

$.ajax({
            url: '/Convocations/CreateConvocation',
            type: 'POST',
            dataType: 'json',
            data: JSON.stringify(convocationData),
            contentType: 'application/json',
            success: function (data) {
                self.Convocations.push(new Convocation(self.addSession(), self.addDesc()));
                self.addDesc("");
                self.addSession("");
            },
            error: function (err) {
                alert(err.status + " : " + err.statusText);
            }
        });

【问题讨论】:

  • 您正在从 javascript 对象 convocationData 传递 2 个参数(一个称为“sessionCode”,另一个称为“description”),但您的控制器操作仅接受一个名为“convocationData”的 1 个参数。您的服务端操作不知道也不关心您调用了您的 javascript 对象变量......只是它的属性和值。另外,我认为您不需要 JSON.stringify 您的数据对象。
  • 另外,我会用[HttpPost] 装饰您的控制器操作,而不是将参数 1 逐个添加到操作方法中,而是创建一个与您从 javascript 发布的对象匹配的模型(属性名称和数据类型)。所以你的操作方法可能看起来像这样:public async Task&lt;ActionResult&gt; CreateConvocation(ConvocationData model)。然后只需在 C# 中使用正确的属性创建 POCO 类(ConvocationData)

标签: c# jquery asp.net knockout.js asp.net-core-mvc


【解决方案1】:

像这样添加[FromBody]属性

[HttpPost]
public async Task<ActionResult> CreateConvocation([FromBody]string convocationData)
{
    return text;
}

您可以在这里阅读更多内容Accepting Raw Request Body Content with ASP.NET Web API

更新:

另外,在您的帖子中阅读 zgood 的 cmets。而不是使用JSON.stringify,您应该按照他在评论中的描述创建一个相应的模型。

更新 2:

JS模型类

class Convocation {
  constructor(sessionCode, description) {
    this.sessionCode = sessionCode;
    this.description = description;
  }
}

C# DTO 类

public class Convocation
{
    public string SessionCode{ get; set; }
    public string Description { get; set; }
}

然后您可以将您的操作方法更新为此

[HttpPost]
public async Task<ActionResult> CreateConvocation([FromBody]Convocation convocation)
{
    return text;
}

和 ajax 发布到这里:

$.ajax({
    url: '/Convocations/CreateConvocation',
    type: 'POST',
    dataType: 'json',
    data: new Convocation(tmpSession, tmpDescription),
    contentType: 'application/json',
    success: function(data) {
        self.Convocations.push(new Convocation(self.addSession(), self.addDesc()));
        self.addDesc("");
        self.addSession("");
    },
    error: function(err) {
        alert(err.status + " : " + err.statusText);
    }
});

我没有测试代码,但它应该可以工作。

【讨论】:

  • 能否展示如何在 javascript 中调用该模型。我注意到只有一个元素被设置
  • 我注意到你的方法只发送一个参数,基本上我需要一个类
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2020-04-09
相关资源
最近更新 更多