WykopGwardel.icio.us

Wykorzystanie ActionSelectionAttribute w ASP.NET MVC

23 listopada 2008, 13:46

KomentarzeKomentarze: 0 KategorieKategorie: asp.netmvc

Budując aplikację przy użyciu ASP.NET MVC możemy trafić na następujący problem. Otóż standardowo jedna forma na stronie skojarzona jest z konkretną akcją kontrolera. Na przykład:

<form action="User/Save" />

Często zdarza się jednak, że na takiej formie mamy więcej niż jeden input typu submit. Wciśnięcie któregoś z nich spowoduje wysłanie danych formy zawsze do tej samej metody "Save" zdefiniowanej w kontrolerze "User".

W metodzie "Save" możemy w sumie sprawdzić z jakiego submita wyszła akcja i stosownym if'em zdecydować co ma się dziać dalej. Na szczęście możemy sobie nieco zautomatyzować korzystając z filtru typu "ActionSelectionAttribute". Poniżej prezentuję kod atrybutu "AcceptInputAttribute":

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Reflection;
   4:  using System.Web.Mvc;
   5:   
   6:  namespace Softio.Web.MVC.Filters
   7:  {
   8:      [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
   9:      public class AcceptInputAttribute : ActionSelectionAttribute
  10:      {
  11:   
  12:          public AcceptInputAttribute()
  13:          {
  14:              Names = new List<string>();
  15:          }
  16:   
  17:          public AcceptInputAttribute(string name)
  18:              : this()
  19:          {
  20:              Names.Add(name);
  21:          }
  22:   
  23:          public AcceptInputAttribute(params string[] name)
  24:              : this()
  25:          {
  26:              Names.AddRange(name);
  27:          }
  28:   
  29:          public List<string> Names { get; private set; }
  30:   
  31:          public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
  32:          {
  33:              if (controllerContext.HttpContext.Request.HttpMethod.Equals("POST", StringComparison.InvariantCultureIgnoreCase))
  34:              {
  35:                  foreach (string n in Names)
  36:                  {
  37:                      if (!controllerContext.HttpContext.Request.Form[n].IsNullOrEmpty())
  38:                      {
  39:                          return true;
  40:                      }
  41:                  }
  42:              }
  43:              return false;
  44:          }
  45:      }
  46:  }

Atrybut ten nadany metodzie "Save" zbada, czy został przesłany zdefiniowany element formy.

Czytaj więcej...

Ten post jest widoczny także na: ZINE.NET