2015-05-19 2 views
0

Я создаю пользовательский Editor Templates для моих классов. Я хотел бы отфильтровать все свойства навигации. В любом случае, чтобы достичь этого, не используя соглашения об именах для моих свойств?Фильтрация свойств навигации в ViewDate.ModelMetaData.Properties

Моего Частичный вида выглядит следующим образом:

@foreach (var property in ViewData.ModelMetadata.Properties) 
{ 
    <div class="form-group form-inline"> 
     <div class="col-xs-5"> 
      @if (property.PropertyName.StartsWith("Z") || 
       property.PropertyName.Equals("thename", StringComparison.CurrentCultureIgnoreCase) 
       ){ 
       continue; 
      } 
      @Html.Label(property.DisplayName) 
      @Html.TextBox(property.PropertyName) 
     </div> 
     <div class="col-xs-5"> 

     </div> 
    </div> 
} 

ответ

1

Попробуй использовать флаг Его для отображения. Если для флага установлено значение «Показать», отобразите свойство с меткой и текстовым полем.

1

Метод, который я хотел бы использовать, заключается в использовании пользовательского атрибута для вашей модели (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 для предоставления метаданных на ранней стадии конвейера и упрощения программирования на ваших страницах просмотра.

Смежные вопросы