2012-11-30 167 views
7

我有一個問題,我真的只是不明白。我有一個非常簡單的模型,它有一個List作爲公共成員。每當我的控制器在回發中從模型中刪除一個元素時,TextBoxFor()HTML幫助程序似乎沒有拿起這些更改。這些助手似乎在緩存某些東西,但我無法把它放在手上。MVC4 HTML TextBoxFor在修改ViewModel後無法工作

甲演示/攝製可以在這裏找到:http://broken.azurewebsites.net

攝製

  1. 導航到填充有基於零個值
  2. 擊中 「測試」 按鈕http://broken.azurewebsites.net
  3. 通知的4列中的值POST回頁面,我刪除列表中的第一個項目
  4. 注意「真實」值是正確的,0元素已被刪除,但問題在於通過TextBoxFor()呈現的值。我不知道爲什麼它仍然呈現0時,該元素不再存在。

模式

public class ItemViewModel 
{ 
    public string Description { get; set; } 
    public decimal? Amount { get; set; } 
} 

public class TestViewModel 
{ 
    public TestViewModel() 
    { 
     Items = new List<ItemViewModel>(); 
    } 

    public List<ItemViewModel> Items { get; set; } 
} 

控制器

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new TestViewModel(); 

     for (var i = 0; i < 4; i++) 
     { 
      model.Items.Add(new ItemViewModel { Description = i.ToString(), Amount = i }); 
     } 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(TestViewModel model) 
    { 
     model.Items.RemoveAt(0); 

     return View(model); 
    } 

} 

查看

@model Demo.Models.TestViewModel 
@using (Html.BeginForm()) 
{ 
    <table> 
     <thead> 
      <tr><td>Description</td><td>Amount</td><td>Real-Description</td><td>Real-Amount</td></tr> 
     </thead> 
     <tbody> 
      @for (var i = 0; i < Model.Items.Count; i++) 
      { 
       var ii = i; 
       <tr> 
        <td>@Html.TextBoxFor(m => m.Items[ii].Description)</td> 
        <td>@Html.TextBoxFor(m => m.Items[ii].Amount)</td> 
        <td>@Model.Items[ii].Description</td> 
        <td>@Model.Items[ii].Amount</td> 
       </tr> 
      } 
     </tbody> 
    </table> 
    <button>Test</button> 
} 

回答

15

變更您的文章的索引方法,下面所需的行爲:

[HttpPost] 
    public ActionResult Index(TestViewModel model) 
    { 
     ModelState.Clear();  

     model.Items.RemoveAt(0); 

     return View(model); 
    } 

這裏的原因:

的TextBoxFor結合在ModelState中,而不是模型值崗位價值。因此,在您的應用程序中,當您按下「測試」按鈕時,即使在更改模型值後,文本框也會綁定到它們已有的值,並且不會在回發中更新。例如,如果第一行中的文本框顯示爲0,並且即使在回發後底層模型的值爲1,它們也將保持綁定該值。此行爲背後的原因是驗證。如果您希望在文本框中輸入int並且用戶輸入「SomeTextValue」,則模型聯編程序將無法綁定到int屬性,並且它將處於驗證錯誤狀態。然後,您希望用戶看到一條說「SomeTextValue」不是整數的錯誤。請輸入一個整數,因爲您希望用戶輸入值在那裏。

裏克施特拉爾完美地解釋了它在這個博客帖子

http://www.west-wind.com/weblog/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes

及以下品牌威爾遜:

http://forums.asp.net/post/3688022.aspx

+0

謝謝,我相信這是問題。我會測試並報告回來。 –

相關問題