No estoy seguro de cuán lejos va la localización con el archivador de modelos predeterminado (DefaultModelBinder), pero puede crear fácilmente un archivador que pueda manejar el análisis cultural específico de los datos, por ejemplo, crear una nueva clase, llamemos que la DoubleModelBinder, copypasta lo siguiente:
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]);
}
}
Ahora, lo que estamos haciendo aquí, es el establecimiento de nuestro propio lenguaje-conscientes doble analizador. Cuando implementamos la interfaz IModelBinder, necesitamos crear un método BindModel. Aquí es donde se hace la carne, pero antes de que podamos analizar algo, necesitamos obtener un proveedor de archivos basado en el idioma del navegador. Entonces, usamos el método GetUserCulture para tratar de preparar el idioma del navegador. Si no podemos volver a la cultura actual.
Cuando tenemos eso, estamos en condiciones de analizar el valor. Primero lo tomamos del ValueProvider (que en realidad es un compuesto de muchos proveedores de valor, por ejemplo, de la colección de Formularios, de la colección de Solicitudes, etc.), y luego lo analizamos utilizando el IFormatProvider descubierto, que es el CultureInfo que ahora tenemos.
Una vez que haya hecho eso, es bastante trivial agregarlo a la colección de carpetas de modelo;
ModelBinder.Binders[typeof(Double)] = new DoubleModelBinder();
Pruébalo y ver si eso ayuda.
Eso funcionó perfectamente. Pero ahora me pregunto cómo se hace esto en el modo predeterminado y por qué es diferente de alguna manera. –
Probablemente porque DefaultModelBinder es el archivador que mejor se adapta a todos, no creo que realmente esté diseñado para hacer algo más complejo que enlazar valores simples a los modelos. –
No llamaría complejo de dobles realmente, pero veo tu punto. De todos modos parece resuelto y espero que no venga y me muerda en la espalda más tarde. Thx :) –