2012-09-13 25 views
1

我是新來的南希和我試圖使用Nancy.ModelBinding命名空間這樣一個小數屬性綁定:全球化問題與小數和南希模型綁定

var model = this.Bind<AddPaymentModel>(); 

我的應用程序使用非美國文化(pt-BR)其中小數表示方式不同(4.50將爲4.50),並且上面的代碼會引發錯誤,即使CurrentCulture已正確設置爲pt-BR。我張貼JSON,我想這可能是相關的JSON解串器...我的堆棧跟蹤的

部分:

Nancy.RequestExecutionException: Oh noes! ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: 450,00 is not a valid value for Decimal. ---> System.FormatException: Input string was not in a correct format. 
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt) 
at System.Decimal.Parse(String s, NumberStyles style, IFormatProvider provider) 
at System.ComponentModel.DecimalConverter.FromString(String value, NumberFormatInfo formatInfo) 
at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 
--- End of inner exception stack trace --- 
at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 
at System.ComponentModel.TypeConverter.ConvertFromInvariantString(String text) 
at Nancy.Json.JavaScriptSerializer.ConvertToType(Type type, Object obj) 
at Nancy.Json.JavaScriptSerializer.ConvertToObject(IDictionary`2 dict, Type type) 
at Nancy.Json.JavaScriptSerializer.ConvertToType(Type type, Object obj) 
at Nancy.Json.JavaScriptSerializer.ConvertToType[T](Object obj) 
at Nancy.Json.JavaScriptSerializer.Deserialize[T](String input) 
--- End of inner exception stack trace --- 
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
at Nancy.ModelBinding.DefaultBodyDeserializers.JsonBodyDeserializer.Deserialize(String contentType, Stream bodyStream, BindingContext context) 
at Nancy.ModelBinding.DefaultBinder.DeserializeRequestBody(BindingContext context) 
at Nancy.ModelBinding.DefaultBinder.Bind(NancyContext context, Type modelType, String[] blackList) 

我缺少什麼?

+1

它可能在解串器中的錯誤(它使用一個單聲道) - 你可以在Github上登錄的問題嗎? –

+0

@StevenRobbins完成。問題#782。 – gsimoes

回答

0

您可以嘗試切換到用於nancy的Newtonsoft.JsonNet序列化程序。

http://nuget.org/packages/Nancy.Serialization.JsonNet

這裏是一個「一網打盡」的例子implementaion

using System; 
using System.Collections.Generic; 
using Nancy; 
using Nancy.Bootstrapper; 
using Nancy.Serialization.JsonNet; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace Application 
{ 
    public class Bootstrapper : DefaultNancyBootstrapper 
    { 

     protected override NancyInternalConfiguration InternalConfiguration 
     { 
      get 
      { 
       return NancyInternalConfiguration.WithOverrides(
       c => c.Serializers.Insert(0, typeof(ModifiedJsonNetJsonSerializer))); 
      } 
     } 

     public class ModifiedJsonNetJsonSerializer : JsonNetSerializer 
     { 
      public ModifiedJsonNetJsonSerializer() 
       : base(new List<JsonConverter> { new FloatConverter() }) 
      { } 

      public class FloatConverter : JsonConverter 
      { 
       public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
       { 
        var floatValue = (float)value; 
        writer.WriteValue(string.Format("{0:0.00}", floatValue)); 
       } 

       public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
       { 
        var jobject = JToken.Load(reader); 
        var str = jobject.Value<string>(); 
        float number; 
        try 
        { 
         number = float.Parse(str); 
        } 
        catch (FormatException) 
        { 
         str = str.IndexOf(".", StringComparison.Ordinal) > -1 ? str.Replace('.', ',') : str.Replace(',', '.'); 
         number = float.Parse(str); 
        } 
        return number; 
       } 

       public override bool CanConvert(Type objectType) 
       { 
        return objectType == typeof(float) || objectType == typeof(Single); 
       } 
      } 
     } 
    } 
}