Je voudrais créer une fonctionnalité de liaison de modèle afin qu'un utilisateur puisse entrer ',' '.' etc pour les valeurs de devises qui se lient à une double valeur de mon ViewModel.asp.net liaison de modèle de devise MVC 1.0 et 2.0
J'ai été en mesure de le faire dans MVC 1.0 en créant un classeur de modèle personnalisé, mais depuis la mise à niveau vers MVC 2.0, cette fonctionnalité ne fonctionne plus.
Est-ce que quelqu'un a des idées ou de meilleures solutions pour effectuer cette fonctionnalité? Une meilleure solution consisterait à utiliser des annotations de données ou des attributs personnalisés.
public class MyViewModel
{
public double MyCurrencyValue { get; set; }
}
Une solution préférée serait quelque chose comme ça ...
public class MyViewModel
{
[CurrencyAttribute]
public double MyCurrencyValue { get; set; }
}
Ci-dessous est ma solution pour le modèle obligatoire dans MVC 1.0.
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 vous traitez une liste de MyViewModel cela change-t-il le ModelBinder pour l'action? public ActionResult Index ([ModelBinder (typeof (CurrencyBinder))] IList modèle) –
David
S'il vous plaît voir ma mise à jour. –