2

我正在尝试使用 ajax 将我的模型值从 View 传递到 Controller JQuery。在我的控制器中,该模型显示为null

控制器已从 ajax 方法调用,但问题是控制器中的对象显示为null.

这是模型的简单结构:

public class Invoice
{
    public Invoice(InvoiceHeader invHeader, List<InvoiceItems> InvItmem)

    {
        this.invHeader = invHeader;
        this.InvItmem = InvItmem;
    }

    public InvoiceHeader invHeader { get; private set; }
    public List<InvoiceItems> InvItmem { get; private set; }

}

这是控制器的结构:

[HttpPost]
public ActionResult InsertItems(List<Invoice> invoice)
{
    //List<InvoiceItems> asd = new List<InvoiceItems>();
    //asd = invoice.();

    return Json(true, JsonRequestBehavior.AllowGet);
}

这是视图:

@model BeetaTechModel.Invoice

@{
    ViewBag.Title = "Index";
    var val = Json.Encode(Model);
}

<h2>Index</h2>

    <script type="text/javascript"> 
        $(document).ready(function () {

            $("#btnSubmit").click(function () {

                // var val = Json.Encode(Model);

                var check = @Html.Raw(val);

                $.ajax({
                    type: 'POST',
                    url: "Invoice/InsertItems",
                    data: '{info:' + JSON.stringify(check) + '}' ,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    success: function (data) {
                        alert(data);        
                    }
                });
            });
        });
    </script>

@{Html.RenderPartial("InvoiceHeader", Model.invHeader);}

@{Html.RenderPartial("InvoiceItems", Model.InvItmem);}        

<input type="submit" id="btnSubmit" value="Log In" />
4

2 回答 2

6

您的代码有 4 个问题。

  • 第一个在您的 AJAX 调用中,必须如下所示:

    $.ajax({
        url: 'Invoice/InsertItems',
        type: 'POST',
        data: JSON.stringify(check),
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert(data);
        }
    });
    
  • 第二个问题是您订阅.click了提交按钮的事件而没有取消该按钮的默认操作。因此,如果此按钮在表单内,当您单击它时,浏览器会将表单发布到服务器并重定向到表单的操作,从而没有时间执行 AJAX 调用。因此,请确保您取消了按钮的默认操作:

    $("#btnSubmit").click(function (e) {
        e.preventDefault();
    
        ... your AJAX call comes here
    });
    
  • 第三个问题是您的Invoice模型没有默认(无参数)构造函数,这意味着您不能在不编写自定义模型绑定器的情况下将其用作控制器操作的参数,因为默认模型绑定器不知道如何实例化它。

  • 第四个问题是模型的invHeaderInvItmem属性Invoice都没有公共设置器,这意味着 JSON 序列化器将无法设置它们的值。因此,请确保您已修复 Invoice 模型:

    public class Invoice
    {
        public InvoiceHeader InvHeader { get; set; }
        public List<InvoiceItems> InvItmem { get; set; }
    }
    
于 2013-08-07T11:48:30.713 回答
0
  1. data: '{info:'与型号名称不匹配:public ActionResult InsertItems(List<Invoice> invoice)
  2. 可能您需要模型的默认构造函数才能正确反序列化。
  3. 检查您的 ajax 数据是否可以反序列化List<Invoice>
于 2013-08-07T11:50:50.187 回答