2011-10-28 19 views
5

HTML yardımcısını, model özelliklerinden özellik değeri gerektiren bir yöntemle genişlettim. Bu yüzden özel bir özellik tanımladım.MVC3 HTML Yardımcısında Özel Öznitelik Değeri alamıyor

public class ChangeLogFieldAttribute : Attribute { 
     public string FieldName { get; set; } 
    } 

Modelimde bu şekilde kullanılır. nitelik özelliği için kullanılırsa benim yardımcı yönteminde

[Display(Name = "Style")] 
    [ChangeLogField(FieldName = "styleid")] 
    public string Style { get; set; } 

, benim özelliğinin FieldName değerini almak için aşağıdaki kodu var. Bu kodu ulaştığında containerType null olduğu için

 var itemName = ((MemberExpression)ex.Body).Member.Name; 

     var containerType = html.ViewData.ModelMetadata.ContainerType; 
     var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault(); 
     if (attribute != null) { 
      itemName = attribute.FieldName; 
     } 

Ancak, bir istisna olsun.

Bunlardan herhangi birini doğru yaptığımı emin değilim, ancak bu kadar uzaklaşmak için yaklaşık 4 farklı kaynaktan çekildim. Sorunumu veya bir alternatifi düzeltmek için önerebilirseniz minnettar olurum.

Teşekkürler. ÇÖZÜM

Bunu bazı çimdik olmasına rağmen ben, Darin Dimitrov'un çözümünü kullanılan İLE

GÜNCELLEME. İşte ekledim. Metatdata özniteliğinin varlığını kontrol etmek zorundaydım ve her şey güzeldi. yardımcı içindeki ardından

public class ChangeLogFieldAttribute : Attribute, IMetadataAware 
{ 
    public string FieldName { get; set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["fieldName"] = FieldName; 
    } 
} 

ve:

 var fieldName = ((MemberExpression)ex.Body).Member.Name; 

     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
      fieldName = (string)metadata.AdditionalValues["fieldName"]; 
     } 
+0

bir özellik adını almak için, yerine 'metadata.PropertyName' kullanabilirsiniz '((MemberExpression) ex.Body) .Member.Name'. Bu olsa da, alan adları için çalışmıyor ve ben herhangi bir '.FieldName' veya' .MemberName' görmüyorum. –

cevap

11

Sen nitelik meta farkında yapabilir

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
var fieldName = metadata.AdditionalValues["fieldName"];