MVC 4 Ajax.BeginForm POST不绑定到conroller中的模型

dav*_*avy 3 ajax asp.net-mvc asp.net-ajax asp.net-mvc-4

对不起这里的代码量,但这是解释发生的事情的最佳方式.

我在MVC 4局部视图中给出了这段代码:

  <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
  @using (Ajax.BeginForm("TestPost", new AjaxOptions { HttpMethod = "Post" }))
    {                               
        foreach (var d in Model.DataItemsWithLabels)
        {                                    
            @Html.LabelFor(m => d.DataName)
            @Html.TextBoxFor(m => d.DataValue);             
        }

        <input type="submit" value="Save" />
    }
Run Code Online (Sandbox Code Playgroud)

我的控制器动作如下:

 public ActionResult TestPost(CmaPartialModel model)
 {         
        return PartialView("Transaction", model);
 }
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我有一些代码填充了一个对象列表(只有它们是空的),定义为:

 public List<DataItemWithLabel> DataItemsWithLabels { get; set; }      

    public class DataItemWithLabel
    {
        public string DisplayName { get; set; }

        public string DataName { get; set; }

        [Required]
        public string DataValue { get; set; }
    }  
Run Code Online (Sandbox Code Playgroud)

我还有什么认为正确的web.config条目:

我在这里和其他地方阅读过大量帖子但没有成功.

代码会发布到TestPost方法,但模型始终为空.有人可以告诉我为什么会这样吗?

Lin*_*Lin 7

总是获得null价值的原因是模型绑定器不知道如何绑定对象列表.见下面的例子:

public class CmaPartialModel 
{
    public List<DataItemWithLabel> DataItemsWithLabels { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

然后在你查看中使用它:

@model  CmaPartialModel 

<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
@using (Ajax.BeginForm("TestPost", new AjaxOptions { HttpMethod = "Post" }))
{
    for(var i = 0; i < Model.DataItemsWithLabels.Count; i++)
     {
        @Html.LabelFor(m => m.DataItemsWithLabels[i].DataName)
        @Html.TextBoxFor(m => m.DataItemsWithLabels[i].DataValue)
     }
    <input type="submit" value="Save" />
}
Run Code Online (Sandbox Code Playgroud)

最后,您的操作方法应如下所示:

 public ActionResult TestPost(CmaPartialModel model)
 {         
        return PartialView("Transaction", model);
 }
Run Code Online (Sandbox Code Playgroud)

更新

你也可以foreach在你的视图中使用如下:

foreach (var item in Model.DataItemsWithLabels.Select((value, i) => new { i, value }))
{
   @Html.LabelFor(m => m.DataItemsWithLabels[@item.i].DataName)
   @Html.TextBoxFor(m => m.DataItemsWithLabels[@item.i].DataValue);   
}
Run Code Online (Sandbox Code Playgroud)