46 votes

Le liant de modèle par défaut d'ASP.NET MVC 3 ne lie pas les propriétés décimales

Pour une raison quelconque, quand j'envoie ce JSON à une action :

{"BaseLoanAmount": 5000}

qui est censé être lié à un modèle avec une propriété décimale nommée "BaseLoanAmount", il ne se lie pas, il reste juste 0. Mais si j'envoie :

{"BaseLoanAmount": 5000.00}

il lie la propriété, mais pourquoi ? 5000 ne peut-il pas être converti en événement décimal s'il ne comporte pas de chiffres décimaux ?

73voto

ryudice Points 10016

Après avoir consulté le code source d'asp.net mvc, il semble que le problème soit que pour la conversion, asp.net mvc utilise le convertisseur de type du framework, qui pour une raison quelconque renvoie faux pour une conversion d'int en décimal, j'ai fini par utiliser un fournisseur de modèle de liaison personnalisé et un modèle de liaison pour les décimales, vous pouvez le voir ici :

public class DecimalModelBinder : DefaultModelBinder
{
    #region Implementation of IModelBinder

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (valueProviderResult.AttemptedValue.Equals("N.aN") ||
            valueProviderResult.AttemptedValue.Equals("NaN") ||
            valueProviderResult.AttemptedValue.Equals("Infini.ty") ||
            valueProviderResult.AttemptedValue.Equals("Infinity") ||
            string.IsNullOrEmpty(valueProviderResult.AttemptedValue))
            return 0m;

       return Convert.ToDecimal(valueProviderResult.AttemptedValue);
    }    

    #endregion
}

Pour enregistrer ce ModelBinder, il suffit de mettre la ligne suivante à l'intérieur Application_Start() :

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());

12voto

Darin Dimitrov Points 528142

Essayez de l'envoyer comme ça :

{ "BaseLoanAmount": "5000" }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X