2013-04-19 16 views
6

"Expression > ifade" türünde parametre üretme Bir editör için bir HTML Yardımcısı yazıyorum. Buradaki amaç AutoGenerateField özniteliklerine sahip Model'den özellikler almak ve her satırın bir alanın bir ismini (öznitelikten) ve bir TextBox'u veya alanın gerçek değerini içeren bir CheckBox'ı içeren bir tablo oluşturmaktır. HTMLHelper,

HTMLHelper ile ilgili bir sorunum var. Ben bütün yardımcı modeli ve tek değeri göndermek için, onlar parametreyi ihtiyaç olarak ben yansımanın kullanıyorum

"Expression<Func<TModel, TValue>> expression". 

olarak, örneğin TextBoxFor gibi yöntemleri kullanamaz ve bunun yerine özelliğini göndermeye çalıştığımız, hala VisualStudio bunu yanlış kullanım olarak kabul eder. Aşağıda

benim HtmlHelper yöntemi basitleştirilmiş:

public static MvcHtmlString GenerateEditor<TModel>(this HtmlHelper<TModel> htmlHelper) 
{ 
    var model = htmlHelper.ViewData.Model; 
    var result = String.Empty; 

    //generating container, etc ... 

    foreach (var property in model.GetType().GetProperties()) 
    { 
     var attr = property.GetCustomAttributes(typeof (DisplayAttribute), true).FirstOrDefault(); 
     if (attr == null) continue; 
     var autoGenerate = ((DisplayAttribute)attr).AutoGenerateField; 
     if(autoGenerate) 
     { 
      //here I'm building the html string 
      //My problem is in the line below: 
      var r = htmlHelper.TextBoxFor(property); 
     } 
    } 
    return MvcHtmlString.Create(result); 
} 

bir fikir?

cevap

2

Sadece lambda olmayan aşırı yükleri kullanmaya ne dersiniz? : Bu kadar bu aynı şeyi yapması gerektiğini fonksiyonun lambda sürümünü kullandığınızda bile mülkiyet adına ayarlanır form öğesinin name niteliğini yanlış değilsem InputExtensions.TextBox()

if(autoGenerate) 
{ 
    //here I'm building the html string 
    //My problem is in the line below: 
    var r = htmlHelper.TextBox(property.Name); 
} 
//not sure what you do with r from here... 

.

Lambda işlevinin ne yaptığını doğrulamaya çalışacağım, siz de TModel ürününü yanınızda bulundurduğunuzdan aynısını yapabileceksiniz.


Güncelleme sonunda çağırır sonunda şeylerin üstünkörü görünüyor gelen member.Name aldığı ExpressionHelper.GetExpressionText(LambdaExpression expression)ExpressionHelper.cs içine çağıran InputHelper() çağırır TextBoxFor InputExtensions.cs kaynak koduna içindeki şeylerin bir hızlı bir görünüm itibaren

Girdi öğesindeki html özniteliği adı.

Şu anda tam olarak doğrulayamıyorum çünkü pencerelerde değilim ama lambda olmayan işlevin sizin ihtiyacınıza uygun olduğunu düşünüyorum. Bana nasıl olduğunu söyler misin?

+0

Teşekkürler! Başarıyla çalıştı! – Anelook

+0

@Anelook Hoş Geldiniz) – gideon

İlgili konular