Метод, который я хотел бы использовать, заключается в использовании пользовательского атрибута для вашей модели (POCO). Используйте атрибут для добавления специальных свойств. Перед входом в цикл вы можете использовать отражение, чтобы получить Dictionary<string, customAttribute>
, где string
- это имя свойства модели, а customAttribute
- это настраиваемый атрибут, применяемый к классу (проверьте для null
для обработки свойств, которые не имеют применяемого настраиваемого атрибута). Я приложил сценарий LinqPad, который демонстрирует эти концепции, и вы получаете приятные визуальные эффекты, чтобы увидеть, что происходит.
void Main()
{
var obj = new MyCustomClass();
var tModel = obj.GetType(); /*in your case this will probably be ModelMetadata.ModelType as below */
//var tModel = ViewData.ModelMetadata.ModelType;
var pAttributes = tModel
.GetProperties() /*modify the parameter to determine whether you want public fields as well etc*/
.ToDictionary(p =>
p.Name,
p => ((MyCustomAttribute)p.GetCustomAttribute(typeof(MyCustomAttribute)))
);
pAttributes.Dump();
/*I'm using this to mimic your ViewData.ModelMetadata.Properties */
var modelProperties = new[] {
new { PropertyName = "Age" },
new { PropertyName = "Name" },
new { PropertyName = "Height" },
new { PropertyName = "Area" }
}.ToList();
foreach (var property in modelProperties)
{
if (pAttributes.ContainsKey(property.PropertyName) && (pAttributes[property.PropertyName]?.HasSpecialTreatment ?? false))
Console.WriteLine("I am special: " + property.PropertyName);
else
Console.WriteLine(property.PropertyName);
}
}
// Define other methods and classes here
public class MyCustomClass
{
[MyCustomAttribute(HasSpecialTreatment = true)]
public string Name { get; set; }
[MyCustomAttribute(HasSpecialTreatment = false)]
public int Age { get; set; }
[MyCustomAttribute(HasSpecialTreatment = true)]
public int Height { get; set; }
public int Length { get; set; }
public int Area { get; set; }
}
public class MyCustomAttribute : Attribute
{
public bool HasSpecialTreatment = false;
}
Недостатком такого подхода является то, что она опирается на отражение, и я бы гораздо раньше использовать этот подход для создания шаблона, а не выполнять на лету каждый раз, когда страница выполняет.
Какую версию MVC вы используете? Лучшими подходами были бы использование ModelMetaDataProvider или IDisplayMetadataProvider в зависимости от версии MVC для предоставления метаданных на ранней стадии конвейера и упрощения программирования на ваших страницах просмотра.