Nancy: Problème de liaison de modèle possible avec les décimales

Créé le 1 juil. 2014  ·  3Commentaires  ·  Source: NancyFx/Nancy

http://stackoverflow.com/questions/24439997/nancy-decimal-property-binding-not-working

Oh noes! ---> Nancy.ModelBinding.ModelBindingException: Unable to bind to type: Nancy.Models.SomeModel
at Nancy.ModelBinding.DefaultBinder.Bind(NancyContext context, Type modelType, Object instance, BindingConfig configuration, String[] blackList)
at Nancy.ModelBinding.DynamicModelBinderAdapter.TryConvert(ConvertBinder binder, Object& result)
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at Nancy.ModelBinding.ModuleExtensions.Bind[TModel](INancyModule module)
at KBZServisNancy.Modules.SomeModule.<.ctor>b__2(Object x) in d:\Nancy\Modules\SomeDecimalModule.cs:line 38
at CallSite.Target(Closure , CallSite , Func`2 , Object )
at Nancy.Routing.Route.<>c__DisplayClass4.b__3(Object parameters, CancellationToken context)
--- End of inner exception stack trace ---
at Nancy.NancyEngine.InvokeOnErrorHook(NancyContext context, ErrorPipeline pipeline, Exception ex)
at Nancy.NancyEngine.InvokeOnErrorHook(NancyContext context, ErrorPipeline pipeline, Exception ex)

On dirait que c'est un bogue, je l'ai essayé moi-même avec une route et une décimale et j'ai obtenu la même exception.

Commentaire le plus utile

Écrivez simplement votre propre ITypeConverter

``` c#
///


/// Convertisseur Nancy pour convertir des types numériques avec InvariantCulture.
///

classe publique NancyNumericConverter : ITypeConverter
{
public bool CanConvertTo (Type destinationType, contexte BindingContext)
{
return destinationType.IsNumeric();
}

    public object Convert(string input, Type destinationType, BindingContext context)
    {
        if (string.IsNullOrEmpty(input))
        {
            return null;
        }

        return System.Convert.ChangeType(input, destinationType, CultureInfo.InvariantCulture);
    }
}

```

Tous les 3 commentaires

DecimalConverter.ConvertFrom est utilisé dans le contexte de la culture actuelle, il attend "1,1" au lieu de "1.1" dans la culture turque. Une stratégie de secours peut être implémentée en utilisant ConvertFrom avec InvariantCulture. Acceptez-vous les demandes de tirage ?

Écrivez simplement votre propre ITypeConverter

``` c#
///


/// Convertisseur Nancy pour convertir des types numériques avec InvariantCulture.
///

classe publique NancyNumericConverter : ITypeConverter
{
public bool CanConvertTo (Type destinationType, contexte BindingContext)
{
return destinationType.IsNumeric();
}

    public object Convert(string input, Type destinationType, BindingContext context)
    {
        if (string.IsNullOrEmpty(input))
        {
            return null;
        }

        return System.Convert.ChangeType(input, destinationType, CultureInfo.InvariantCulture);
    }
}

```

Écrivez simplement votre propre ITypeConverter

Merci pour la suggestion, ça marche très bien !
Mais il semble que System.Convert.ChangeType ne supporte pas les types nullables.

Peut être corrigé en utilisant Nullable.GetUnderlyingType comme ceci :

/// <summary>
/// Nancy converter to convert numeric types with InvariantCulture.
/// </summary>
public class InvariantCultureNumericConverter : ITypeConverter
{
    public bool CanConvertTo(Type destinationType, BindingContext context)
    {
        return destinationType.IsNumeric();
    }

    public object Convert(string input, Type destinationType, BindingContext context)
    {
        if (string.IsNullOrEmpty(input))
        {
            return null;
        }

        destinationType = Nullable.GetUnderlyingType(destinationType) ?? destinationType;

        return System.Convert.ChangeType(input, destinationType, CultureInfo.InvariantCulture);
    }
}
Cette page vous a été utile?
0 / 5 - 0 notes