2016-09-13 35 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

你有在每一行可編輯的列列嗎? –

相關問題