Nancy: Possível problema de Model Binding com decimais

Criado em 1 jul. 2014  ·  3Comentários  ·  Fonte: 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 isso é bug, tentei eu mesmo com uma rota e decimal e obtive a mesma exceção.

Comentários muito úteis

Basta escrever o próprio ITypeConverter

`` `c #
///


/// Conversor de Nancy para converter tipos numéricos com InvariantCulture.
///

public class NancyNumericConverter: ITypeConverter
{
public bool CanConvertTo (Digite destinationType, BindingContext context)
{
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 comentários

DecimalConverter.ConvertFrom é usado no contexto da cultura atual, ele espera "1,1" em vez de "1,1" na cultura turca. Uma estratégia de fallback pode ser implementada usando ConvertFrom com InvariantCulture. Você aceita solicitações de pull?

Basta escrever o próprio ITypeConverter

`` `c #
///


/// Conversor de Nancy para converter tipos numéricos com InvariantCulture.
///

public class NancyNumericConverter: ITypeConverter
{
public bool CanConvertTo (Digite destinationType, BindingContext context)
{
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);
    }
}

`` `

Basta escrever o próprio ITypeConverter

Obrigado pela sugestão, funciona muito bem!
Mas parece que System.Convert.ChangeType não suporta tipos anuláveis.

Pode ser corrigido usando Nullable.GetUnderlyingType assim:

/// <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);
    }
}
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

thecodejunkie picture thecodejunkie  ·  8Comentários

jlennox picture jlennox  ·  5Comentários

ndphuong picture ndphuong  ·  3Comentários

jchannon picture jchannon  ·  9Comentários

jgillich picture jgillich  ·  7Comentários