Nancy: Decimals์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ ๋ฐ”์ธ๋”ฉ ๋ฌธ์ œ

์— ๋งŒ๋“  2014๋…„ 07์›” 01์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: 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)

์ด๊ฒƒ์ด ๋ฒ„๊ทธ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์™€ ์‹ญ์ง„์ˆ˜๋กœ ์ง์ ‘ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋™์ผํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๋ƒฅ ITypeConverter

``` C#
///


/// InvariantCulture๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆซ์ž ์œ ํ˜•์„ ๋ณ€ํ™˜ํ•˜๋Š” Nancy ๋ณ€ํ™˜๊ธฐ.
///

๊ณต๊ฐœ ํด๋ž˜์Šค NancyNumericConverter : ITypeConverter
{
public bool CanConvertTo(์œ ํ˜• ๋Œ€์ƒ ์œ ํ˜•, 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);
    }
}

```

๋ชจ๋“  3 ๋Œ“๊ธ€

DecimalConverter.ConvertFrom์€ ํ˜„์žฌ ๋ฌธํ™”์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ํ„ฐํ‚ค ๋ฌธํ™”์—์„œ๋Š” "1.1" ๋Œ€์‹  "1,1"์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. InvariantCulture์™€ ํ•จ๊ป˜ ConvertFrom์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ฒด ์ „๋žต์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ƒฅ ITypeConverter

``` C#
///


/// InvariantCulture๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆซ์ž ์œ ํ˜•์„ ๋ณ€ํ™˜ํ•˜๋Š” Nancy ๋ณ€ํ™˜๊ธฐ.
///

๊ณต๊ฐœ ํด๋ž˜์Šค NancyNumericConverter : ITypeConverter
{
public bool CanConvertTo(์œ ํ˜• ๋Œ€์ƒ ์œ ํ˜•, 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);
    }
}

```

๊ทธ๋ƒฅ ITypeConverter

์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
ํ•˜์ง€๋งŒ System.Convert.ChangeType ๋Š” nullable ํ˜•์‹์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด 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 ๋“ฑ๊ธ‰