我必须通过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");
}
});
}
任何人都可以告诉我这里我做错了什么。
由于
答案 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错误的具体异常。