2013-08-02 19 views
5

È in qualche modo possibile impostare nomi alternativi per i parametri di querystring in ASP.NET MVC?Nomi alternativi per i parametri di querystring

ho questa semplice azione Indice del controller:

public ActionResult Index(color = "") 
{ 
    ... 
} 

Calling http://mysite.com/mypage/?color=yellow lavori abbastanza bene, il parametro color prende automaticamente il suo valore "gialla" dalla querystring.

Ma ora mi piacerebbe avere una variante localizzata della stessa pagina, con parametri "carini" localizzati, ma ancora con lo stesso metodo di controllo. Esempio: http://mysite.com/mypage/?farve=gul. Qui vorrei che "gul" fosse passato come il parametro color al metodo predefinito Index().

Come si impostano i mapping per nomi alternativi per i parametri di querystring?

+0

Possibile Dupe: http://stackoverflow.com/questions/2146227/how-to-route-a-multiple-language-url-with-a-mvc – Abhitalks

risposta

6

Come si impostano i mapping per nomi alternativi per i parametri di querystring?

È possibile scrivere un raccoglitore modello personalizzato.

Così come in ogni applicazione ASP.NET MVC si inizia scrivendo un modello di vista:

public class MyViewModel 
{ 
    public string Color { get; set; } 
} 

e poi un modello legante per questo modello:

public class MyViewModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var query = controllerContext.HttpContext.Request.QueryString; 
     var value = query["color"] ?? query["gul"] ?? query["couleur"]; 
     return new MyViewModel 
     { 
      Color = value, 
     }; 
    } 
} 

che sarà registrato a vostra Application_Start:

ModelBinders.Binders.Add(typeof(MyViewModel), new MyViewModelBinder()); 

e ora il tuo azione di controllo può richiedere il modello vista come Parametro:

public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 

Naturalmente si potrebbe fare il modello di raccoglitore più flessibile utilizzando alcuni attributo personalizzato sulla proprietà:

public class MyViewModel 
{ 
    [PossibleQueries("color", "gul", "couleur")] 
    public string Color { get; set; } 
} 

e nel modello di legante leggere quei valori e provare a leggere dalla query stringa finché non ne trovi uno che non è nullo.

+0

Grazie, ho implementato un modello personalizzato legante - funziona perfettamente :) –

0

Che ne dici di un secondo controller con un nome localizzato/carino in cui le azioni e i parametri hanno nomi localizzati e chiama le azioni dal controller predefinito/inglese? Con questo metodo hai tutte le parti dell'URL localizzate.

Controller mypage 
{ 
    ActionResult Index(string color) 
    { 
     // normal code 
    } 
} 

Controller meineseite 
{ 
    ActionResult Index(string farbe) 
    { 
     return mypage.Index(farbe); 
    } 
} 
Problemi correlati