Nancy: рджрд╢рдорд▓рд╡ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рдореЙрдбрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдЬреБрд▓ре░ 2014  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: NancyFx/Nancy

http://stackoverflow.com/questions/2443997/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)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрдЧ рд╣реИ, рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдорд╛рд░реНрдЧ рдФрд░ рджрд╢рдорд▓рд╡ рдХреЗ рд╕рд╛рде рдЖрдЬрд╝рдорд╛рдпрд╛ рдФрд░ рдПрдХ рд╣реА рдЕрдкрд╡рд╛рдж рдорд┐рд▓рд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдмрд╕ рдЕрдкрдирд╛ ITypeConverter

``` рд╕реА#
///


/// рдиреИрдиреНрд╕реА рдХрдирд╡рд░реНрдЯрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ InvariantCulture рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
///

рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдиреИрдиреНрд╕реА рдиреНрдпреВрдореЗрд░рд┐рдХ рдХрдирд╡рд░реНрдЯрд░: ITypeConverter
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрд▓ CanConvertTo (рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╕рдВрджрд░реНрдн)
{
рд╡рд╛рдкрд╕реА рдЧрдВрддрд╡реНрдп рдкреНрд░рдХрд╛рд░ред рдЗрд╕рдиреНрдпреВрдореЗрд░рд┐рдХ ();
}

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

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

```

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DecimalConverter.ConvertFrom рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХреГрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рддреБрд░реНрдХреА рд╕рдВрд╕реНрдХреГрддрд┐ рдореЗрдВ "1.1" рдХреЗ рдмрдЬрд╛рдп "1,1" рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред InvariantCulture рдХреЗ рд╕рд╛рде ConvertFrom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝реЙрд▓рдмреИрдХ рд░рдгрдиреАрддрд┐ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ?

рдмрд╕ рдЕрдкрдирд╛ ITypeConverter

``` рд╕реА#
///


/// рдиреИрдиреНрд╕реА рдХрдирд╡рд░реНрдЯрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ InvariantCulture рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
///

рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдиреИрдиреНрд╕реА рдиреНрдпреВрдореЗрд░рд┐рдХ рдХрдирд╡рд░реНрдЯрд░: ITypeConverter
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрд▓ CanConvertTo (рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╕рдВрджрд░реНрдн)
{
рд╡рд╛рдкрд╕реА рдЧрдВрддрд╡реНрдп рдкреНрд░рдХрд╛рд░ред рдЗрд╕рдиреНрдпреВрдореЗрд░рд┐рдХ ();
}

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

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

```

рдмрд╕ рдЕрдкрдирд╛ ITypeConverter

рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ System.Convert.ChangeType рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ Nullable.GetUnderlyingType рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

/// <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);
    }
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕