2

ajax を使用して、ビューからコントローラーにモデル値を渡そうとしています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);
        }
    });
    
  • .click2 つ目の問題は、このボタンのデフォルト アクションをキャンセルせずに、送信ボタンのイベントをサブスクライブしたことです。したがって、このボタンがフォーム内にある場合、クリックすると、ブラウザはフォームをサーバーに POST し、フォームのアクションにリダイレクトして、AJAX 呼び出しを実行する時間がありません。そのため、ボタンのデフォルト アクションをキャンセルしていることを確認してください。

    $("#btnSubmit").click(function (e) {
        e.preventDefault();
    
        ... your AJAX call comes here
    });
    
  • 3 番目の問題は、Invoiceモデルに既定の (パラメーターのない) コンストラクターがないことです。つまり、既定のモデル バインダーはそれをインスタンス化する方法がわからないため、カスタム モデル バインダーを作成しないとコントローラー アクションの引数として使用できません。

  • そして 4 番目の問題は、モデルの プロパティinvHeaderInvItmemプロパティの両方にInvoiceパブリック セッターがないことです。つまり、JSON シリアライザーはそれらの値を設定できません。したがって、請求書モデルが修正されていることを確認してください。

    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 に答える