Non sono sicuro della localizzazione remota con il modello predefinito (DefaultModelBinder), ma puoi creare facilmente un raccoglitore che possa gestire l'analisi specifica della lingua dei dati, ad esempio creare una nuova classe, chiamiamola è il DoubleModelBinder, copypasta il seguente:
public class DoubleModelBinder : IModelBinder
{
/// <summary>
/// Binds the value to the model.
/// </summary>
/// <param name="controllerContext">The current controller context.</param>
/// <param name="bindingContext">The binding context.</param>
/// <returns>The new model.</returns>
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var culture = GetUserCulture(controllerContext);
string value = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName)
.ConvertTo(typeof(string)) as string;
double result = 0;
double.TryParse(value, NumberStyles.Any, culture, out result);
return result;
}
/// <summary>
/// Gets the culture used for formatting, based on the user's input language.
/// </summary>
/// <param name="context">The controller context.</param>
/// <returns>An instance of <see cref="CultureInfo" />.</returns>
public CultureInfo GetUserCulture(ControllerContext context)
{
var request = context.HttpContext.Request;
if (request.UserLanguages == null || request.UserLanguages.Length == 0)
return CultureInfo.CurrentUICulture;
return new CultureInfo(request.UserLanguages[0]);
}
}
Ora, quello che stiamo facendo qui, è stabilire la nostra lingua-aware doppio parser. Quando implementiamo l'interfaccia di IModelBinder, dobbiamo creare un metodo BindModel. Questo è dove la carne di esso è fatta, ma prima di poter analizzare qualcosa, abbiamo bisogno di ottenere un IFormatProvider basato sulla lingua del browser. Quindi, usiamo il metodo GetUserCulture per provare e preparare la lingua del browser. Se non possiamo tornare alla cultura attuale.
Quando abbiamo questo, siamo quindi in grado di analizzare il valore. Per prima cosa lo prendiamo dal ValueProvider (che in realtà è un insieme di molti value provider, ad esempio dalla raccolta Form, dalla raccolta di richieste, ecc.) E quindi lo analizziamo usando il IFormatProvider scoperto, che è il CultureInfo che abbiamo ora.
Una volta fatto, è piuttosto semplice aggiungerlo alla raccolta del raccoglitore di modelli;
ModelBinder.Binders[typeof(Double)] = new DoubleModelBinder();
Provare e vedere se questo aiuta.
fonte
2010-07-04 18:38:08
Che ha funzionato perfettamente. Ma ora mi chiedo come sia fatto in quello predefinito e perché è diverso in qualche modo? –
Molto probabilmente perché DefaultModelBinder è un raccoglitore best-fit-for-all, non penso che sia stato davvero progettato per fare qualcosa di più complesso, quindi legare valori semplici ai modelli. –
Non definirei davvero il doppio, ma vedo il tuo punto. Ad ogni modo sembra risolto e spero che non venga e mordimi più tardi. Thx :) –