具有复杂viewmodel数据的Ajax帖子提供500个响应代码

时间:2016-02-11 10:42:23

标签: jquery ajax asp.net-mvc http-status-code-500

我必须通过ajax将InvoiceViewModel数据从视图发送到操作方法。但是,我收到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电话的网址。

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");
        }
    });
}

任何人都可以告诉我这里我做错了什么。

由于

1 个答案:

答案 0 :(得分:1)

Jai的评论是对的:

  

dataType:&#34; json&#34;,更改为dataType:&#34; html&#34;,如果结果是html元素

我看到的另一个问题是你的viewmodel定义了

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

您发布的数据定义了

LstSoftwares: {}

您尝试发布预期列表的对象。相当于JavaScript方面的列表是一个数组,如下所示:

LstSoftwares: []

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

一个简单的解决方案是制作这样的东西:

// 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)并打开&#34;网络&#34;标签(这是Chrome中的名称)。在那里,您可以检查完整的服务器答案,它将适当地显示触发服务器端500错误的具体异常。