2012-06-18 16 views
18

Sorun kullanıcının düzenleyebileceği alanların bir listesi varnasıl bir liste

bir öğenin bir ModelState anahtarı almak için. Model gönderildiğinde, bu öğelerin geçerli olup olmadığını kontrol etmek istiyorum. Veri notasyonlarını kullanamıyorum çünkü her alanın çalışma zamanına kadar bilmeyeceğim farklı bir doğrulama süreci vardır. Doğrulama başarısız olursa, ModelState.AddModelError(string key, string error) numarasını kullanıyorum. Burada anahtar, hata iletisini eklemek istediğiniz html öğesinin adıdır. Bir alan listesi olduğundan, Razor'un html öğesi için ürettiği ad Fields[0].DisplayName gibidir. Sorum şu: görünüm modelinden oluşturulan html adının anahtarını almak için bir yöntem mi var?

Çözüm teşebbüs

hiçbir şans ile anahtar için toString() yöntemi denedik. Ayrıca HtmlHelper sınıfını inceledim ama yararlı bir yöntem görmedim.

Kod Parçacığı

Görünüm Modeli

public class CreateFieldsModel 
{ 
    public TemplateCreateFieldsModel() 
    { 
     FreeFields = new List<FieldModel>(); 
    } 

    [HiddenInput(DisplayValue=false)] 
    public int ID { get; set; } 

    public IList<TemplateFieldModel> FreeFields { get; set; } 


    public class TemplateFieldModel 
    { 
     [Display(Name="Dispay Name")] 
     public string DisplayName { get; set; } 

     [Required] 
     [Display(Name="Field")] 
     public int FieldTypeID { get; set; } 
    } 
} 

Kontrolör

public ActionResult CreateFields(CreateFieldsModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Where do I get the key from the view model? 
     ModelState.AddModelError(model.FreeFields[0], "Test Error"); 
     return View(model); 
    } 
} 

cevap

24

kaynak kodunda etrafında kazma sonra çözüm bulduk. EditorFor() çağrıldığında alan için html adını oluşturmak için kullanılan ExpressionHelper adlı bir sınıf var. ExpressionHelper sınıfının, o html öğesinin adı olan bir dize döndüren GetExpressionText() adlı bir yöntemi vardır. İşte ... nasıl kullanılacağını olduğunu

for (int i = 0; i < model.FreeFields.Count(); i++) 
{ 
    //Generate the expression for the item 
    Expression<Func<CreateFieldsModel, string>> expression = x => x.FreeFields[i].Value; 
    //Get the name of our html input item 
    string key = ExpressionHelper.GetExpressionText(expression); 
    //Add an error message to that item 
    ModelState.AddModelError(key, "Error!"); 
} 

if (!ModelState.IsValid) 
{ 
    return View(model); 
} 
+4

Bu iyi bir şey ama bu mantığı güzel bir uzantı yöntemiyle tamamlayan başka bir yazı bulduk: http://stackoverflow.com/a/12689563/1825109 – Michael12345

0

Sen tabanlı denetleyici içinde anahtar (giriş elemanının adı) çerçeveye sahip f nasıl oluşturuluyor formda iels.

Örn. CreateFieldsModel arasında FreeFields koleksiyonunda ikinci öğenin doğrulama FreeFields[1].DisplayName olarak giriş öğesinin yani anahtar adını çerçeveleriz başarısız olursa doğrulama hatası eşlenebilmesi nereye gittiğini.

olarak bildiğim kadarıyla kolayca denetleyicisinden o alınamıyor.

+0

Belki adı bazı sabit değer ve alanın değeri adı niteliğini almak dışında EditorFor yönteminin çıkış olmak olan gizli bir alan? –

İlgili konular