2016-09-13 39 views
3

我搜索了四周,找不到我的问题的答案。在foreach循环中的表单不会将模型发回控制器

我有一个观点,即需要接受Foo在像这样:

@model IEnumerable<MyApplication.Models.Foo> 

里面我有一个表视图。我通过我的Foo模型填充表格,只是执行简单的foreach循环。我添加了一列,用户可以在文本区域的每一行添加详细信息并保存。

所以认为是这样的:

@foreach (var item in Model) 
    { 
    <tr> 
     <th> 
      @using (Html.BeginForm("AddDetails", "MyController", FormMethod.Post)) 
      { 
       @Html.AntiForgeryToken()   
       @Html.HiddenFor(u => item.Id) 

       @Html.TextAreaFor(u => item.Details, new { @class = "form-control" })        

       <input type="submit" value="Save" class="btn btn-sm btn-default" /> 
      } 
     </th> 
    </tr> 
    } 

我的控制器的设置是这样的:

[HttpPost] 
    public ActionResult AddDetails(Foo foo) 
    { 
    } 

当我设置一个断点该控制器上foo总是有null值的Details财产和Id始终为0。当它传递到视图中时,它的所有属性都设置为正确,所以我不确定它为什么不能正确回发?

我已经试过这样:

@using (Html.BeginForm("AddDetails", "MyController", FormMethod.Post, new { foo = Model })) 

我也试图消除foreach循环和改变它只是一个单一的模型视图和查看通过接受只是单一的模式,而不是IEnumerable。当我这样做时,它会回传得很好。

而且这也行不通。我想知道这是否与我的表单处于foreach循环内有关,也许我需要做更多的工作,比如为元素添加一个data-id属性,然后捕获按钮上的单击事件并执行一个AJAX调用控制器并传递正确的值?

编辑对不起,我完全忘了视图模型。这里是什么样子:

public class Foo 
{ 
    public int Id { get; set; } 

    public string Details { get; set; } 
} 
+0

如果您更多地了解与视图绑定的视图模型/使用表格 – mmcrae

+0

将“foreach”更改为“for”循环时会发生什么,可能会有所帮助?我很确定这是你的问题,因为这样,默认的modelbinder不能正确地重建你的对象来发布。 [看这个问题](http://stackoverflow.com/questions/15636284/for-each-loop-with-controls-and-submitting-form-html-beginform-in-mvc-4)作为参考 – Jonesopolis

+0

@Jonesopolis我会尝试将其更改为'for'循环。我摆脱了'foreach'循环只是为了测试它,当我摆脱它时它会回传得很好。我尝试过之后会更新另一条评论。 – maxshuty

回答

2

一般来说,发布到与表单视图组成不同的模型是一种糟糕的形式。它使很多事情变得困难,其中最重要的是从验证错误中恢复。

你在做什么在这里是通过Foo列表循环,创造多种形式,将提交各只有一个Foo只接受单个Foo动作。尽管帖子本身没有问题,但在模型上使用*For助手可能不会生成正确的输入名称,该名称是模型绑定器将发布的值绑定到其他模型所必需的。至少,如果由于验证错误而需要返回到此视图,则无法保留用户的发布数据,从而迫使他们完全重复他们的工作。

理想情况下,您应该张贴Foo整个列表只有一个形式包装的迭代(在这种情况下,你需要使用for而非foreach)。或者您应该简单地列出Foo s的链接,以编辑特定的Foo,您只需填写一个表格即可。Foo

0

尝试做this.possible问题

形式应表 单一形式的整个表

外面包裹里面TBODY你的专栏编辑器不THEAD

@using (Html.BeginForm("AddDetails", "MyController", FormMethod.Post)) 
{ 
//thead and tbody 
    } 
+0

对不起,我需要把它放在里面,这样行才有形式。 – maxshuty

+0

为什么你需要这样展示? –

+0

你有在每一行可编辑的列列吗? –

相关问题