Nancy: Mögliches Modellbindungsproblem mit Dezimalstellen

Erstellt am 1. Juli 2014  ·  3Kommentare  ·  Quelle: 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)

Sieht so aus, als wäre dies ein Fehler, habe es selbst mit einer Route und einer Dezimalzahl ausprobiert und die gleiche Ausnahme erhalten.

Hilfreichster Kommentar

Schreiben Sie einfach eigene ITypeConverter

``` c#
///


/// Nancy-Konverter zum Konvertieren numerischer Typen mit InvariantCulture.
///

öffentliche Klasse NancyNumericConverter : ITypeConverter
{
public bool CanConvertTo(Type destinationType, BindingContext Kontext)
{
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);
    }
}

```

Alle 3 Kommentare

DecimalConverter.ConvertFrom wird im Kontext der aktuellen Kultur verwendet. Es erwartet "1,1" anstelle von "1.1" in der türkischen Kultur. Eine Fallback-Strategie kann implementiert werden, indem ConvertFrom mit InvariantCulture verwendet wird. Akzeptieren Sie Pull-Requests?

Schreiben Sie einfach eigene ITypeConverter

``` c#
///


/// Nancy-Konverter zum Konvertieren numerischer Typen mit InvariantCulture.
///

öffentliche Klasse NancyNumericConverter : ITypeConverter
{
public bool CanConvertTo(Type destinationType, BindingContext Kontext)
{
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);
    }
}

```

Schreiben Sie einfach eigene ITypeConverter

Danke für den Vorschlag, funktioniert super!
Aber es sieht so aus, als ob System.Convert.ChangeType keine Nullable-Typen unterstützt.

Kann mit Nullable.GetUnderlyingType wie folgt behoben werden:

/// <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);
    }
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen