2010-04-21 21 views
13

Başarılı bir eylemden sonra (RedirectToAction işlevini kullanmak yerine) aynı görünümü oluşturmak istiyorum, ancak bu görünümde görüntülenen model verilerini değiştirmem gerekiyor.Gönderilmek üzere gönderilmeden önce denetlenen eylem formundaki yayınlanmış form verileri nasıl değiştirilir?

[AcceptVerbs("POST")] 
    public ActionResult EditProduct(int id, [Bind(Include="UnitPrice, ProductName")]Product product) { 
     NORTHWNDEntities entities = new NORTHWNDEntities(); 

     if (ModelState.IsValid) { 
      var dbProduct = entities.ProductSet.First(p => p.ProductID == id); 
      dbProduct.ProductName = product.ProductName; 
      dbProduct.UnitPrice = product.UnitPrice; 
      entities.SaveChanges(); 
     } 

     /* Neither of these work */ 
     product.ProductName = "This has no effect"; 
     ViewData["ProductName"] = "This has no effect either"; 

     return View(product); 
    } 

kimse doğru yöntem, bunu başarmak için ne olduğunu biliyor mu: Aşağıdaki bu işe yaramadığını iki yöntem gösterilmektedir zoraki bir örnektir?

cevap

19

ayrıca bu araştırma sonra aşağıdaki kod Eylem etkisi yoktur neden bir açıklama Anahtarın aranması sırasında aşağıdaki sıra önceliklidir:

  1. ViewData.ModelState sözlüğe giriş
  2. Model özelliği (güçlü yazılmış bir görünüm varsa). Bu özellik, ModelState her zaman çok Modeli doğrudan (product.ProductName) veya ViewData değiştirerek, doldurulur "(ViewData [View.ViewData.Model bir kısayol)
  3. ViewData sözlüğe giriş HTTP Post Eylemler için

olduğunu ProductName "]) hiçbir etkisi yoktur.

ModelState.SetModelValue("ProductName", null); 

Sen basitleştirmek için bir uzantısı yöntemi oluşturabilirsiniz: ModelState değerini temizlemek için,

ModelState.SetModelValue("ProductName", new ValueProviderResult("Your new value", "", CultureInfo.InvariantCulture)); 

Veya: doğrudan ModelState değiştirmenize gerek yoksa

, bunu yapmak için sözdizimi sözdizimi:

public static class ModelStateDictionaryExtensions { 
    public static void SetModelValue(this ModelStateDictionary modelState, string key, object rawValue) { 
     modelState.SetModelValue(key, new ValueProviderResult(rawValue, String.Empty, CultureInfo.InvariantCulture)); 
    } 
} 

Sonra sadece yazabilirsiniz:

ModelState.SetModelValue("ProductName", "Your new value"); 

Ayrıntılar için bkz. Consumption of Data in MVC2 Views.

+2

Teşekkürler, bu çok yararlı oldu. Bunu, yanlış bir girildikten sonra bir kredi kartı numarasını yeniden görüntülemek için kullandım. Bu görevin ne kadar önemsiz/sezgisel olmadığı şaşkına kapılmıştım. – smdrager

+0

Cevabınız için teşekkürler – marathonman

2

Değerler ModelState'da depolanır.

İstediğin yapmalıyım:

ModelState.SetModelValue("ProductName", "The new value"); 

olsa ... Doğru yöntem PRG (Post/Redirect/Get) pattern takip etmek olacağını yapıyor önermek olmaz.

HTHs,
Charles

DÜZENLEME: Eğer modelini değiştirmeden önce() ModelState.Clear gerçekleştirin @Gary

tarafından
+1

Teşekkür - o çözüm aslında nasıl çalışır, ben yerine sadece "ProductName daha anahtarının "product.ProductName" belirtmek için gerekli olmasına rağmen ". Gerçek senaryomda (örnek kod, resim için oluşturuldu), bir doğrulama hatasından sonra belirli bir değeri temizlemem gerekiyordu, bu yüzden yeniden yönlendirmek istemedim. Doğrulamalar başarılı olduğunda, önerdiğiniz PRG şablonunu takip ediyorum. Tekrar teşekkürler. – gxclarke

+0

Bu, herhangi bir doğrulama hatasını da temizleyecektir? – Mac

-1

bulduğumuz gibi daha iyi yansıtacak şekilde Güncelleme ModelState ayar değerinin oldu.

<% Html.EditorFor(x => x.ProductName); 

HTML Yardımcıları kullanımları:

product.ProductName = "This has no effect"; 
ViewData["ProductName"] = "This has no effect either"; 

Benim Görünüm HTML Yardımcıları kullanır:

... 
ModelState.Clear() 
dbProduct.ProductName = product.ProductName; 
dbProduct.UnitPrice = product.UnitPrice; 
... 
+0

Adından da anlaşılacağı gibi, ModelState.Clear() tüm model durumunu siler, bu istenmeyen bir durumdur. – gxclarke

0

Bu basit şartlar altında yeniden değerlendirmenin modelini tetikleyecektir:

ModelState.Clear(); 
model.Property = "new value"; 
TryValidateModel(model); 
İlgili konular