UpdateModel bez stringów

24 stycznia 2010, 22:08

KomentarzeKomentarze: 0 KategorieKategorie: asp.net mvc

Metoda UpdateModel jest metodą dostępną w klasie kontrolera, która w automagiczny sposób przepisze wartości przesłane z formularza do naszego obiektu modelu. Niestety przepisze wszystkie jakie tylko zostały przesłane. A co jeśli nie chcemy przepisywać wszystkich? Wystarczy podać listę dopuszczonych wartości do przepisywania. Niestety lista ta to nic innego jak array stringów.

Poniżej prezentuję kawałek kodu, który dzięki kilku prostym zabiegom pozwala na typowane przekazanie listy właściwości. Stringi won!

Najpierw stworzyłem bazową klasę kontrolera, która zawiera spreparowaną metodę UpdateModel. Niestety nie da się użyć ExtensionsMethod, gdyż UpdateModel jest protected.

   1:  public abstract class ControllerExt : Controller
   2:  {
   3:      protected void UpdateModel(TModel model, params Expressionobject>>[] property) where TModel : class
   4:      {
   5:          var props = new List<string>(property.Length);
   6:          foreach (var p in property)
   7:          {
   8:              var memberExpression = RemoveUnary(p.Body) as MemberExpression;
   9:              if (memberExpression == null)
  10:              {
  11:                  throw new NullReferenceException("Can not retrieve info about member of {0}".FormatThis(typeof(TModel).Name));
  12:              }
  13:              props.Add(memberExpression.Member.Name);
  14:          }
  15:          this.UpdateModel(model, props.ToArray());
  16:      }
  17:   
  18:      private static Expression RemoveUnary(Expression body)
  19:      {
  20:          var unary = body as UnaryExpression;
  21:          if (unary != null)
  22:          {
  23:              return unary.Operand;
  24:          }
  25:          return body;
  26:      }
  27:  }

Dzięki temu zabiegowi każdy kontroler dziedziczący po naszym nowym kontrolerze bazowym będzie wyposażony w metodę, której użycie wygląda następująco:

   1:  // Gdzieś w metodzie akcji kontrolera
   2:  UpdateModel<MyModel>(model, x => x.Number);

Oczywiście można tu się pokusić o jakąś optymalizację i buforowanie listy właściwości dla podanego typu modelu. Miłej zabawy :)

Jeśli spodobał Ci się ten artykuł, to podziel się tą informacją z innymi.

Nikt jeszcze nie skomentował tego artykułu. Bądź pierwszy.

Dodaj komentarz Dodaj komentarz

Twój email (niepublikowany/opcjonalnie):

Twoja strona (opcjonalnie):

Imię i nazwisko/nick (wymagane):

Treść (wymagane):

Chcę być poinformowany o kolejnych komentarzach:

Te pola zostaw puste

Uwaga! Zastrzegam sobie prawo do usuwania obraźliwych i wulgarnych komentarzy.