2017-01-11 79 views
-1

我有一个输入表单,它使用与此类似的模型呈现。为了清晰起见,我试图简化示例。使用jquery ajax post将数组传递给控制器​​失败

[Serializable] 
public class OrderDetailsModel 
{ 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 

    public Address[] OrderAddresses { get; set; } 
} 

[Serializable] 
public class Address 
{ 
    public string BuildingNameNumber { get; set; } 
    public string Town { get; set; } 
    public string Postcode { get; set; } 
} 

它使用类似于此

<form id="orderForm"> 
    <div> 
     @Html.LabelFor(model => model.FirstName) 
    </div> 
    <div> 
     @Html.EditorFor(model => model.FirstName) 
    </div> 
    <div> 
     @Html.LabelFor(model => model.Surname) 
    </div> 
    <div> 
     @Html.EditorFor(model => model.Surname) 
    </div> 


    @for (int i = 0; i < 3; i++) 
    { 
     var addressDisplayDivId = $"addressDisplay{i}"; 

     <div id="@addressDisplayDivId"> 
      <div> 
       @Html.LabelFor(model => model.OrderAddresses[i].BuildingNameNumber) 
      </div> 
      <div> 
       @Html.EditorFor(model => model.OrderAddresses[i].BuildingNameNumber, new {@id = $"buildingNameNumber{i}"}) 
      </div> 
      <div> 
       @Html.LabelFor(model => model.OrderAddresses[i].Town) 
      </div> 
      <div> 
       @Html.EditorFor(model => model.OrderAddresses[i].Town, new {@id = $"town{i}"}) 
      </div> 
      <div> 
       @Html.LabelFor(model => model.OrderAddresses[i].Postcode) 
      </div> 
      <div> 
       @Html.EditorFor(model => model.OrderAddresses[i].Postcode, new {@id = $"postcode{i}"}) 
      </div> 
     </div> 
    } 

    <a href="/MyController/ActionMethod" id="submit">Submit</a> 
</form> 

我试图使用jQuery AJAX

$("#submit").click(function(e) { 
    e.preventDefault(); 

    var submitUrl = $("#submit").attr("href"); 
    var model = $("#orderForm").serialize(); 
    $.ajax({ 
     type: "POST", 
     url: submitUrl, 
     data: model, 
     success: function(result) { 
      alert("Success"); 
     }, 
     error: function(result) { 
      alert("Error"); 
     } 
    }); 
}); 

到一个控制器动作

public MyController 
{ 
    public ActionResult ActionMethod(OrderDetailsModel model) 
    { 
    } 
} 
发布形式剃刀标记呈现

问题是米y行动没有被调用。如果我删除了地址[],那么它可以正常工作,但在模型中引入这种复杂性似乎可以防止帖子发挥作用。

这个问题似乎存在于jquery序列化以及如何在发布到动作之前构造Address阵列。

任何人都可以提出一个处理这个问题的方法吗?

+2

当我测试它时,此代码适合我。我想你错过了一些重要的细节,这是造成差异。 –

+1

你在哪里遇到异常?呼叫是否落入“错误”回调?网络选项卡显示的是对ajax呼叫的响应? – ADyson

+0

'我/ ActionMethod'' - 删除'控制器' - 我假设它真的是'公共类MyController:Controller' –

回答

0

尽管我们从Ajax调用中获得了成功响应,但我们还是推断出实际上存在隐藏的错误。

集合是只读的错误

我改变了地址阵列为IList:

public Address[] OrderAddresses { get; set; } 

public IList<Address> OrderAddresses { get; set; } 

临瑕疵解决了!

相关问题