2010-05-06 5 views
6

Sto lavorando con alcuni software di terze parti che creano i parametri di querystring con i trattini nei loro nomi. Stavo dando un'occhiata a this SO question e sembra che la loro soluzione sia molto vicina a quello di cui ho bisogno, ma sono troppo ignorante per quanto riguarda la roba MVC sottostante per capire come adattarlo per fare ciò di cui ho bisogno. Idealmente, mi piacerebbe semplicemente sostituire i trattini con caratteri di sottolineatura e questa sarebbe una soluzione abbastanza buona. Se ce n'è uno migliore, allora sono interessato a sentirlo.Gestione variabili MVC2 con trattini nel nome

Un esempio di un URL che voglio gestire è questo:

http://localhost/app/Person/List?First-Name=Bob&My-Age=3 

con questo controller:

public ActionResult List(string First_Name, int My_Age) 
{ 
    {...} 
} 

a ripetere, non posso cambiare la querystring generato così ho bisogno di sostenerlo con il mio controller in qualche modo. Ma come?

Per riferimento, sotto è il RouteHandler personalizzato che viene utilizzato per gestire underscore nei nomi di controller e nomi di azioni dalla domanda SO ho fatto riferimento in precedenza che potremmo essere in grado di modificare a compiere quello che voglio:

public class HyphenatedRouteHandler : MvcRouteHandler 
{ 
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_"); 
     requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_"); 
     return base.GetHttpHandler(requestContext); 
    } 
} 

risposta

7

Hai provato [Bind(Prefix="First-name")]? Potrebbe funzionare ...

Un modo sarebbe con un raccoglitore modello personalizzato. Un altro modo sarebbe con un filtro azione. Utilizzare il Raccoglitore del modello se si desidera eseguire questa operazione su un tipo specifico . Utilizzare il filtro azione se si desidera eseguire questa operazione su un'azione specifica o controller . Così, per il secondo metodo si potrebbe fare qualcosa di simile:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var keys = filterContext.HttpContext.Request.QueryString.AllKeys.Where(k => k.Contains('-')); 
     foreach(var k in keys) 
     { 
      filterContext.ActionParameters.Add(
       new KeyValuePair<string, object>(
        k.Replace('-', '_'), filterContext.HttpContext.Request.QueryString[k])); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
+0

In realtà anziché aggiungere agli ActionParameters che comporterebbero un'eccezione poiché l'elemento esiste già, è possibile impostare il valore: 'filterContext.ActionParameters [k. Sostituisci ('-', '_')] = filterContext.HttpContext.Request.QueryString [k]; ' –

+0

Idea interessante, @Darin. Non sono sicuro in che modo mi piace di più. –

+0

Non è una questione di piacere, il tuo codice genererà un'eccezione dato che c'è già il parametro 'First_Name' nella raccolta' ActionParameters' che deriva dal nome dell'argomento del metodo. –

1

Ho avuto lo stesso problema. Alla fine, piuttosto che fare qualcosa di troppo complesso ottengo solo i parametri di stringa di query utilizzando

string First_Name = Request["First-Name"]; 

Si consiglia di verificare la presenza di valori nulli in caso il parametro non è lì, ma questo si è occupata per me. È inoltre possibile includere un parametro facoltativo per ActionResult per scopi di test ecc.