0

我必须InvoiceViewModel通过 ajax 将数据从视图发送到操作方法。但是,我收到 500 内部服务器错误代码。

查看我需要从视图发送到控制器的模型详细信息

public class InvoiceViewModel
{
    [DisplayName("Invoice ID")]
    public string InvoiceId { get; set; }
    [DisplayName("Number of Line items")]
    public int LineItemCount { get; set; }
    public int TotalItemCount{get;set;}
    public int VendorId { get; set; }
    public List<SoftwareViewModel> LstSoftwares { get; set; }
    InvoiceViewModel()
    {
        LstSoftwares = new List<SoftwareViewModel>();
    }
}

public class SoftwareViewModel
{
    public string Name { get; set; }
    public string Edition { get; set; }
    public string Version { get; set; }
    public string LicenseNumber { get; set; }
    public string ExpiryDate { get; set; }
    public string AssetNumber { get; set; }
}

这是我的控制器。它直接位于根目录中。我正确地提供了 ajax 调用的 url。

public class HomeController : Controller
{
    [HttpPost]
    public ActionResult SaveInvoice(InvoiceViewModel invoiceDetails)
    {
        ViewBag.Message = "Your application description page.";
        return View();
    }
}

如果我如下更改操作方法的参数类型。是击球动作法。但是,invoiceDetails 为空

   [HttpPost]
    public ActionResult SaveInvoice(string invoiceDetails)
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

这是ajax调用代码。

function SaveInvoice()
{
    var mydata = {
        InvoiceId: "",
        VendorId: 0,
        LineItemCount: 0,
        TotalItemCount: 0,
        LstSoftwares: {}
    };
    var testdata = JSON.stringify(mydata);

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data:testdata,
        dataType: "json",
        url: "/home/SaveInvoice",
        success: function (resp) {
            alert("success")
        },
        error: function () {
            alert("fail");
        }
    });
}

谁能告诉我我在这里做错了什么。

谢谢

4

1 回答 1

1

Jai的评论是正确的:

dataType:“json”,如果结果是 html 元素,则更改为 dataType:“html”

我看到的唯一额外问题是您的视图模型定义

public List<SoftwareViewModel> LstSoftwares { get; set; }

而您发布的数据定义

LstSoftwares: {}

您正在尝试在需要列表的位置发布对象。在 JavaScript 端等价于列表的是一个数组,像这样:

LstSoftwares: []

但是,您似乎不需要将其作为操作的输入值。因此,我建议您使用不同的类将数据发布回您的服务器,该类用于显示数据。我想您的列表中有一个下拉列表或类似的东西。大多数 MVC 示例使用与视图模型相同的类来呈现视图和操作参数。从长远来看,这只会带来问题。

一个简单的解决方案是做这样的事情:

// The class which has the "real data" of your entity:
public class Entity {}

public class ViewModel {
  public Entity MyEntity { get; set; }
  // Additional data for renderig the view
  public List<> {get;set;}
}

这样,您就拥有了一个包含必要数据的实体,这些数据可以用作您的操作的参数,也可以用作您的视图模型的一部分。

还有其他可能的模式,但重点是为不同的目的使用不同的类。

注意:要了解正在发生的事情,您可以使用浏览器的控制台(按 F12)并打开“网络”选项卡(这是 Chrome 中的名称)。在那里,您可以检查完整的服务器答案,它会向您显示在服务器端触发 500 错误的具体异常。

于 2016-02-11T11:02:21.347 回答