Nancy: Posible problema de vinculación de modelos con decimales

Creado en 1 jul. 2014  ·  3Comentarios  ·  Fuente: 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)

Parece que esto es un error, lo probé yo mismo con una ruta y un decimal y obtuve la misma excepción.

Comentario más útil

Simplemente escriba su propio ITypeConverter

`` c #
///


/// Convertidor de Nancy para convertir tipos numéricos con InvariantCulture.
///

clase pública NancyNumericConverter: ITypeConverter
{
public bool CanConvertTo (Escriba destinationType, contexto 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);
    }
}

''

Todos 3 comentarios

DecimalConverter.ConvertFrom se usa en el contexto de la cultura actual. Espera "1,1" en lugar de "1.1" en la cultura turca. Se puede implementar una estrategia alternativa utilizando ConvertFrom con InvariantCulture. ¿Aceptan solicitudes de extracción?

Simplemente escriba su propio ITypeConverter

`` c #
///


/// Convertidor de Nancy para convertir tipos numéricos con InvariantCulture.
///

clase pública NancyNumericConverter: ITypeConverter
{
public bool CanConvertTo (Escriba destinationType, contexto 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);
    }
}

''

Simplemente escriba su propio ITypeConverter

Gracias por la sugerencia, ¡funciona muy bien!
Pero parece que System.Convert.ChangeType no admite tipos que aceptan valores NULL.

Se puede arreglar usando Nullable.GetUnderlyingType así:

/// <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);
    }
}
¿Fue útil esta página
0 / 5 - 0 calificaciones