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"];
}
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. –