2010-11-14 21 views
7

Birkaç özellik içeren bir viewmodel sınıfım var. Temel olarak, geçerli kayıt (kullanıcının düzenlediği) ve bir seçenekler listesi (DropDownListFor kullanarak bir açılır liste doldurmak için kullanılır).MVC DropDownListFor - Doğrulama başarısız olduktan sonra seçenekleri elle yeniden yerleştirmeliyim?

Form gönderildikten sonra, modeltat geçerli değilse, ben görünümüne dönüyorum. Formun ModelState["name"].Value.AttemptedValue'dan 'reddedildi' girişi kullanılarak doldurulduğunu anlıyorum, ancak açılan listenin değerleri listesiyle ilgili ne yapacağımı bilmiyorum.

Hiçbir şey yapmazsam, doğrulama başarısız olur ve sayfaya dönersek, 'object nesnesine ayarlanmayan nesne başvurusu' hatası alırsınız, çünkü viewmodel'in liste özelliği boştur. Bunun form boşluğundan bağlanmadığı için boş olduğunu biliyorum, bu nedenle görünümüne dönmeden önce veritabanından yeniden oluşturabilirim.

Bu konuda gitmek için doğru yol mu, yoksa açılan değerleri kalıcı hale getirmenin daha açık bir yolunu mu duyuyorum?

cevap

10

POST eylem aynı görünüm dönmek niyetinde eğer Evet, bu doğru yolu şudur: işlemek

  1. bağlama veritabanına
  2. gelen GET eylem liste görünümünü, kullanıcının gönderdiği
  3. Bu eylemde POST eylemi
  4. biçiminde yalnızca seçilen değeri alırsınız, bu nedenle model geçersizse ve görünüm modelinizi doldurmak için listeyi yeniden veritabanından almak için görünümü yeniden görüntülemeniz gerekir.

İşte MVC yaygın olarak kullanılan bir modelin bir örnek:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Items = _repository.GetItems() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // Validation failed, fetch the list from the database 
      // and redisplay the form 
      model.Items = _repository.GetItems(); 
      return View(model); 
     } 
     // at this stage the model is valid => 
     // use the selected value from the dropdown 
     _repository.DoSomething(model.SelectedValue); 
     // You no longer need to fetch the list because 
     // we are redirecting here 
     return RedirectToAction("Success", "SomeOtherController"); 
    } 
} 
+0

teşekkür: istemci tarafında ve ajax çağrısından sonra

geri

$.ajax({ url: '@Url.Action("Index", "Controller")', data: $("#form").serialize(), type: 'POST', success: function (data) { if (data.status == "Successful") { // you can redirect to another page by window.location.replace('New URL') } else { // you can display validation message } } }); 

Sen ActionMethod gibi olacak status değerine çekle ne kadar istediğiniz yapmaya karar verebilir. Bu benim kullandığım tekniktir. Sadece yeni bir teknolojiyi kullanarak bir projede kendi başıma çalışmak, ikinci bir fikre karşı kontrol etmek iyidir! – Gavin

0

yerine varsayılan Gönder düğmesini var formu gönderme, veri göndermek için xhr ajax çağrısını kullanabilirsiniz.

Bu tekniğin avantajı, listelerinizi yeniden doldurmanız gerekmeyecektir.

[HttpPost] 
     public JsonResult Index() 
     { 
      if (ModelState.IsValid) 
      { 
       return Json(new { status = "Success" });  
      } 
      else 
      { 
       return Json(new { status = "Fail" }); 
      } 
     } 
İlgili konular