Me gustaría crear una funcionalidad de enlace de modelo para que un usuario pueda ingresar ',' '.' etc. para los valores de moneda que se unen a un valor doble de mi ViewModel.asp.net enlace de modelo de moneda MVC 1.0 y 2.0
Pude hacer esto en MVC 1.0 creando una carpeta de modelo personalizada, sin embargo, desde la actualización a MVC 2.0 esta funcionalidad ya no funciona.
¿Alguien tiene alguna idea o mejor solución para realizar esta funcionalidad? Una mejor solución sería usar alguna anotación de datos o un atributo personalizado.
public class MyViewModel
{
public double MyCurrencyValue { get; set; }
}
Una solución preferida sería algo como esto ...
public class MyViewModel
{
[CurrencyAttribute]
public double MyCurrencyValue { get; set; }
}
A continuación es mi solución para la unión de MVC 1.0 modelo.
public class MyCustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
object result = null;
ValueProviderResult valueResult;
bindingContext.ValueProvider.TryGetValue(bindingContext.ModelName, out valueResult);
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueResult);
if (bindingContext.ModelType == typeof(double))
{
string modelName = bindingContext.ModelName;
string attemptedValue = bindingContext.ValueProvider[modelName].AttemptedValue;
string wantedSeperator = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
string alternateSeperator = (wantedSeperator == "," ? "." : ",");
try
{
result = double.Parse(attemptedValue, NumberStyles.Any);
}
catch (FormatException e)
{
bindingContext.ModelState.AddModelError(modelName, e);
}
}
else
{
result = base.BindModel(controllerContext, bindingContext);
}
return result;
}
}
Si está tratando con una lista de MyViewModel ¿eso cambia el ModelBinder para la acción? public ActionResult Índice ([ModelBinder (typeof (CurrencyBinder))] IList modelo) –
David
Por favor, consulte mi actualización. –