2015-05-15 3 views
0

У меня есть типичный веб-сайт с административной частью, где администратор может добавлять множество разных объектов. Я, как разработчик, должны урезать каждый из них (для предотвращения ввода объектов, как «имя состояния» Я делаю это есть в Validate интерфейсе метод IValidatableObject:.Trim action для всех свойств

public class AddProjectViewModel : ProjectFormBaseViewModel, IValidatableObject 
    { 
     public int? ParentProjectID { get; set; } 

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 
      ProjectName = ProjectName.Trim(); 
      DescriptionText = DescriptionText.Trim(); 

Конечно, я могу сделать это в методе, где проект добавляет в БД или что-то еще. Но если у меня есть 10 форм и каждая форма имеет 2-3 строковых свойства, то этот код немного «прямо». Может быть, кто-нибудь может порекомендовать другой, более «красивый» подход, чтобы обрезать всю строку параметры? Т.е. через атрибут свойства или что-то другое?

ответ

4

Почему бы вам не использовать отражение?

var obj = YourObjectToBeTrimmed(); 
foreach(var property in obj.GetType().GetProperties().Where(x => x.PropertyType == typeof(string))) { 
    property.SetValue(obj, (property.GetValue(obj) as string).Trim()); 
} 

Также можно использовать атрибуты или другие модификации отражения.

EDIT. Теперь я изменяю свой ответ из-за запроса OP. В следующем коде все свойства, отмеченные TrimAttribute, будут обрезаны.

class Program { 
     static void Main(string[] args) { 
      // The sample properties. 
      var notTrimmedString = " smth "; 
      var trimmedString = notTrimmedString.Trim(); 

      // Prepare an object to trim its properties. 
      var obj = new A { 
       PropertyToBeTrimmed = notTrimmedString, 
       PropertyNotToBeTrimmed = notTrimmedString, 
      }; 

      // Trim properties marked by TrimAttribute. 
      foreach(var property in obj.GetType().GetProperties().Where(x => 
       x.PropertyType == typeof(string) && 
       x.GetCustomAttributes(typeof(TrimAttribute), true).Any())) { 
       property.SetValue(obj, (property.GetValue(obj) as string).Trim()); 
      } 

      // Check. 
      Console.WriteLine(obj.PropertyToBeTrimmed == notTrimmedString); 
      Console.WriteLine(obj.PropertyNotToBeTrimmed == notTrimmedString); 
      Console.WriteLine(obj.PropertyToBeTrimmed == trimmedString); 
      Console.WriteLine(obj.PropertyNotToBeTrimmed == trimmedString); 
      Console.ReadKey(); 
     } 
    } 

    /// <summary> 
    /// Sample class. 
    /// </summary> 
    class A { 
     /// <summary> 
     /// This property must be marked by TrimAttribute. 
     /// So it will be trimmed. 
     /// </summary> 
     [Trim] 
     public string PropertyToBeTrimmed { get; set; } 

     /// <summary> 
     /// This property must be not marked by TrimAttribute. 
     /// So it will not be trimmed. 
     /// </summary> 
     public string PropertyNotToBeTrimmed { get; set; } 
    } 

    /// <summary> 
    /// Custom attribute which means need for trimming. 
    /// </summary> 
    class TrimAttribute : Attribute { } 

Я полагаю this учебник поможет вам, если вы новичок в рефлексии и атрибутов.

+0

Но если я хочу обрезать все, кроме одного? :) Нужно иметь другой подход ... возможно, атрибут будет лучше ... –

+1

@OlegSh Я обновил свой ответ. См. Пояснения и комментарии в коде. – Hoborg

0

Можете ли вы обрезать свойства в самой ViewModel?

public class MyModel 
{ 
    private string _prop; 

    public string Prop 
    { 
     get 
     { 
      return !string.IsNullOrEmpty(_prop) ? _prop.Trim() : this._prop; 
     } 
     set 
     { 
      this._prop = value.Trim(); 
     } 
    } 
} 
+1

необходимо создать еще больше «копировать/вставлять» код –

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