2012-09-13 26 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); 
       } 
      } 
     } 
    } 
}