2010-09-28 14 views
8

Bir ifadeyi alan kendi HTML Yardımcımı oluşturmaya çalışıyorum (benzer şekilde, yerleşik LabelFor <> yardımcısına benzer. Bir özelliğin değerini elde etmek için örnekler buldum. örneğin Bu örneklerdeASP.NET MVC'den Değer Alın Lambda Expression

model => mode.Person.Forename 

, kolayca (için yine de bulamıyorum,

model => model.Forename 

Ancak, benim modellerinin bazılarında, ben alt öğeleri içinde özelliklerini elde etmek istiyorum: ifadesi buna benzer) Forename değerini almalıyım. bu değeri almak.

Teşekkürler

cevap

14

sen LabelFor <> yöntemi kullanan aynı kalıbı kullanarak, o zaman ifade daima LambdaExpression olacak ve sadece değerini almak için yürütebilirsiniz.

var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model); 

Genellikle, her zaman LambdaExpressions jenerik ifadeleri sarın ve daha sonra & değerini almak için onları çağırmak derlemek.

Ne isterseniz, Forename değeri değil, alanın kendisi ("Forename" dizgesini yazdırmak için fx.), Tek seçeneğiniz, bir expressionwalking biçimi kullanmaktır. C# 4'te çerçeve, bunun için kullanılabilecek ExpressionVisitor adlı bir sınıf sağlar, ancak çerçevenin önceki sürümleri için bunu kendiniz uygulamanız gerekir - bkz .: http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx

7

Değeri mi arıyorsunuz?

Neden bu işe yaramaz?

public object GetValue<T>(Expression<Func<T>> accessor) 
    { 
     var func = accessor.Compile(); 

     return func.Invoke(); 
    } 
4

İki tane olduğu için bunu ayrı ayrı yanıtladım. Kabul edilen cevabı beğenmedim.

  1. Size lambda ifadesi için temsilci tipi ön ne biliyorsanız özel html yardımcı
  2. yazarken bilginin kritik parçasıdır modeline bir başvuru nasıl açıklamıyor o onu Lambda ifadesine dökmek ve DynamicInvoke kullanmak için gereksizdir. Özel yardımcılar yazabilme deneyimimdeki türlerin önünü bilmek eğilimindeyim.

    public static MvcHtmlString MyHelper<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, byte[]>> expression) 
        { 
    
         var compiledExpression = expression.Compile(); 
         byte[] byteData = compiledExpression(htmlHelper.ViewData.Model); 
    
         ... 
         ... 
         ... 
    
         return new MvcHtmlString(.......); 
        } 
    
    : bir byte dizisini veren bir lambda ifadesi için tasarlanmış bir ön bilgi

Örnek

İlgili konular