【问题标题】:Having trouble passing complex model to controller through ajax call通过 ajax 调用将复杂模型传递给控制器​​时遇到问题
【发布时间】:2020-05-04 15:32:39
【问题描述】:

每当单击按钮时,我都会尝试更新我的模型。当我将我在剃刀文件中发送的数据记录到控制台时,数据就在那里。但是,当调用控制器方法时,模型是空的。

我的onclick方法:

function addCoupon() {
  var code = document.getElementById("coupon-entry").value;
  $.ajax({ // Validate coupon first. This is working.
    method: "post",
    url: `/cart/validate-coupon/` + code,
    contentType: "application/json; charset=utf-8"
  }).done(result => {
    if (result.success) {
      var model = @Html.Raw(Json.Serialize(Model));
      console.log(model); // Countries and CheckoutData are correct here
      $.ajax({
        method: "post",
        url: `/cart/add-coupon/` + code,
        contentType: "application/json; charset=utf-8",
        data: model
      }).done(result => {
        console.log("It worked");
      });
    }
  });
}

我的模特:

public bool IsPos { get; set; }
public List<CountryDto> Countries { get; set; }
public CheckoutData CheckoutData { get; set; }
public string Payment ProcessorError { get; set; }
public bool DisplayRequiredErrors { get; set; }
public List<string> ValidationErrors { get; set; } = new List<string>();
public PaymentInformationModel PaymentInformation { get; set; } = new PaymentInformationModel();
public bool UseSavedCard { get; set; }

我的控制器:

[HttpPost("add-coupon/{code}")]
public async Task<IActionResult> AddCouponAsync(string code, CheckoutModel model)
{
  // Countries and CheckoutData are null here
}

这里发布了几个类似的问题,但它们要么都有简单的模型,要么有的解决方案在我尝试时对我不起作用。

谢谢!

【问题讨论】:

  • 我感觉您在前端的对象映射与您的 api 合同不匹配。您是否在 api 中放置了断点?如果是这样,您可以单步执行代码。您是否在模型上定义了验证?您是否尝试过使用邮递员之类的应用程序进行 api 调用?我认为将您的 api json 请求从 razor 与工作的邮递员 json 请求进行比较会很有用。
  • 这个 /cart/add-coupon + code 需要一个 / 我想像 /cart/add-coupon/ + code
  • 抱歉,我在写这个问题的时候忘记加 / 了。即使使用斜线,这也不起作用。我试图用 Postman 进行这个调用,但我得到了同样的结果:一个空模型。如何在我的 api 中放置断点?你的意思是在控制器方法里面?

标签: javascript c# ajax razor


【解决方案1】:

你应该试着把它改成这个(否则它不是有效的javascript):

(注意需要用''封装)

var model = '@Html.Raw(Json.Serialize(Model))';

【讨论】:

  • 谢谢,但国家和 CheckoutData 仍然为空
  • 好的,但其余字段已填充,即 ProcessError、PaymentInformation 等?
  • 它们要么为空,要么为假,但很难分辨,因为它们应该为空或假。 PaymentInformation 对象实际上是通过的,但它也是一个空模型。
  • 你能传入一个非空/非假值来测试吗?
  • 我传入了 true,但它在我的控制器中显示为 false。所以必须创建一个空白模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2019-01-18
  • 2020-02-26
  • 2020-11-22
  • 2015-09-07
  • 1970-01-01
相关资源
最近更新 更多