2012-11-30 16 views
7

Gerçekten anlamadığım bir sorun var. Halka açık üye olarak bir listesi olan çok basit bir modelim var. Denetleyicim geri gönderme sırasında modelden bir öğeyi kaldırdığında, TextBoxFor() HTML yardımcıları değişiklikleri algılamıyor gibi görünmüyor. Bu yardımcılar bir şeyleri önbelleğe alıyor gibi görünüyor ama parmağımı üzerine koyamıyorum.MVC4 HTML TextBoxForModel'i Değiştirdikten Sonra ÇalışmıyorForel

Bir Deneme/Yeniden oluşturma burada bulunabilir: http://broken.azurewebsites.net

Repro

  1. gidin "test" düğmesine basın sıfır tabanlı değerleri
  2. ile doldurulur http://broken.azurewebsites.net
  3. Bildirim 4 kolon değerlerine Listede ilk öğeyi kaldırdığım sayfaya POST yapmak için
  4. Uyarı "Gerçek" değerler doğru ve 0 öğesi ha kaldırıldı, ancak burada sorun TextBoxFor() ile oluşturulan değerlerle. Bu elemanın artık yokken neden 0 oluşturduğunu anlayamıyorum.

Modelleri

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; } 
} 

Kontrolör

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); 
    } 

} 

Görünüm

TextBoxFor ModelState yerine modeli değerini yılında sonrası değerine bağlanan: aşağıda istenen davranışı için

@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> } 

cevap

15

değiştirin sonrası endeks yöntemi: neden

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

     model.Items.RemoveAt(0); 

     return View(model); 
    } 

burada. Bu nedenle, uygulamanızda Test düğmesine bastığınızda, metin kutuları zaten sahip oldukları değere bağlanır ve model değerleri değiştirildikten sonra bile geri gönderme sırasında güncellenmez. Örneğin, ilk satırdaki metin kutuları 0 gösteriyorsa ve geri gönderildikten sonra ve temel model 1 değerine sahip olsa bile, bu değere bağlı kalırlar. Bu davranışın nedeni doğrulamadır. Metin kutusunda ve "SomeTextValue" kullanıcı girişlerinde bir int bekliyorsanız, model bağlayıcı int özelliğine bağlanamayacak ve doğrulama hatası durumunda olacaktır. Ardından kullanıcının "SomeTextValue" ifadesinin bir tam sayı olmadığını belirten bir hata görmesini istersiniz. Lütfen numaralı bir tam sayı girin, çünkü kullanıcının orada olmak için değer girmesini beklersiniz.

Rick Strahl

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

sonrası bu blogda mükemmel şekilde açıklıyor Ve aşağıda Marka Wilson:

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

+0

sayesinde bu konudur eminim. Test edip raporlarım. –

İlgili konular