I did something similar last year for an ExtJS based RIA app...

 [AttributeUsage(AttributeTargets.ReturnValue, AllowMultiple = false,
Inherited = false)]
  public class EpochJsonReturnBinderAttribute : JSONReturnBinderAttribute
  {
    /// <summary>
    /// Converts target object to its JSON representation
    /// </summary>
    /// <param name="returnType">Type of the target object</param>
    /// <param name="returnValue">The target object</param>
    /// <param name="serializer">The JSON serializer</param>
    /// <returns></returns>
    public override string GetRawValue(Type returnType, object returnValue,
IJSONSerializer serializer)
    {
      if (returnValue == null)
        return returnType.IsArray ? "[]" : "{}";

      if (base.Properties == null)
        return serializer.Serialize(returnValue, new DateConverter());

      Type normalized = returnType.IsArray ? returnType.GetElementType() :
returnType;

      return serializer.Serialize(returnValue, new
PropertyConverter(normalized, base.Properties), new DateConverter());
    }

    #region Nested type: DateConverter

    class DateConverter : IJSONConverter
    {
      const string DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";

      #region IJSONConverter Members

      public void Write(IJSONWriter writer, object value)
      {
        string str;
        if (value is DateTime)
        {
          var time = (DateTime) value;
          str = time.ToString(DateTimeFormat, CultureInfo.InvariantCulture);
        }
        else
        {
          var offset = (DateTimeOffset) value;
          str = offset.ToString(DateTimeFormat,
CultureInfo.InvariantCulture);
        }
        writer.WriteValue(str);
      }

      public bool CanHandle(Type type)
      {
        return (type == typeof (DateTime) || type == typeof (DateTime?));
      }

      public object ReadJson(IJSONReader reader, Type objectType)
      {
        throw new NotImplementedException();
      }

      #endregion
    }

    #endregion

    #region Nested type: PropertyConverter

    class PropertyConverter : IJSONConverter
    {
      readonly List<PropertyInfo> properties = new List<PropertyInfo>();
      readonly Type targetType;

      public PropertyConverter(Type targetType, string propertyNames)
      {
        this.targetType = targetType;

        foreach (string propertyName in propertyNames.Split(','))
        {
          PropertyInfo prop = targetType.GetProperty(propertyName);

          if (prop == null)
          {
            throw new MonoRailException("Failed to JSON serialize object. "
+
                                        "Property " + propertyName + " could
not be found for type " + targetType.FullName);
          }

          properties.Add(prop);
        }
      }

      #region IJSONConverter Members

      public void Write(IJSONWriter writer, object value)
      {
        writer.WriteStartObject();

        foreach (PropertyInfo info in properties)
        {
          object propVal = info.GetValue(value, null);

          writer.WritePropertyName(info.Name);
          writer.WriteValue(propVal);
        }

        writer.WriteEndObject();
      }

      public bool CanHandle(Type type)
      {
        return type == targetType;
      }

      public object ReadJson(IJSONReader reader, Type objectType)
      {
        throw new NotImplementedException();
      }

      #endregion
    }

    #endregion
  }

On Tue, Jun 23, 2009 at 11:15 PM, Gabriel Mancini de Campos <
[email protected]> wrote:

>
> thanks every one...
>
>  however because my target, i made something ugly.
>
>  public class JSJSONReturnBinderAttribute : JSONReturnBinderAttribute,
> IReturnBinder
>    {
>
>
>
>        /// <summary>
>        /// Converts target object to its JSON representation
>        /// </summary>
>        /// <param name="returnType">Type of the target object</param>
>        /// <param name="returnValue">The target object</param>
>        /// <param name="serializer">The JSON serializer</param>
>        /// <returns></returns>
>        public override string GetRawValue(Type returnType, object
> returnValue, IJSONSerializer serializer)
>        {
>
>            IsoDateTimeConverter jsonConverter = new
> IsoDateTimeConverter
>            {
>                Culture = Thread.CurrentThread.CurrentCulture,
>                DateTimeFormat =
> Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern,
>                DateTimeStyles = DateTimeStyles.AssumeLocal
>            };
>            //                jsonSerializer.Converters.Add(new
> JavaScriptDateTimeConverter());
>
>
>
>            StringWriter sw = new StringWriter
> (CultureInfo.InvariantCulture);
>            JsonSerializer jsonSerializer = new JsonSerializer
>            {
>                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
>                NullValueHandling =
> NullValueHandling.Include,
>            };
>
>            //           jsonSerializer.Converters.Add(new
> JavaScriptDateTimeConverter());
>
>
>            jsonSerializer.Converters.Add(jsonConverter);
>
>            using (JsonWriter jsonWriter = new JsonTextWriter(sw))
>            {
>                jsonWriter.Formatting = (Newtonsoft.Json.Formatting)
> Formatting.None;
>                jsonSerializer.Serialize(jsonWriter, returnValue);
>            }
>
>            if (returnValue == null)
>                return returnType.IsArray ? "[]" : "{}";
>
>            return sw.ToString();
>        }
>    }
>
>
> On 22 jun, 12:32, Mike Nichols <[email protected]> wrote:
> > i wonder if date.js has something to help in this regardhttp://
> www.datejs.com/
> >
> > On Jun 22, 7:19 am, Mauricio Scheffer <[email protected]>
> > wrote:
> >
> >
> >
> > > Take a look at the links I posted above, they explain the formats
> > > currently in use and the pros and cons of each.
> > > I wouldn't use other formats as it could hurt interoperability.
> >
> > > On Jun 22, 10:43 am, Jason Meckley <[email protected]> wrote:
> >
> > > > I cannot locate the article, but one alternative I read about is to
> > > > avoid the date serialization altogether by formatting the date to a
> > > > string before sending to the client. then you can easily
> > > > var date = new Date(result.DateAsString);
> > > > from the json result. or you can plug this into an input element. The
> > > > gist of the article was treat Dates like strings instead of dates. it
> > > > makes json and js easier to control.
> >
> > > > On Jun 22, 12:09 am, John Simons <[email protected]> wrote:
> >
> > > > > yeap, I've just checked my code and that is what I'm doing.
> > > > > I think you are only left with one option, do not use
> > > > > JSONReturnBinderAttribute and do the serialization yourself in the
> > > > > action. That is what I ended up doing.
> >
> > > > > that said you can always contribute a patch or another option is to
> > > > > create a suggestion inhttp://castle.uservoice.com
> >
> > > > > Cheers
> > > > > John
> >
> > > > > On Jun 22, 1:49 pm, Mauricio Scheffer <[email protected]>
> > > > > wrote:
> >
> > > > > > It can't be eval()'ed to a Date object with the default format.
> Only
> > > > > > when the JavaScriptDateTimeConverter is used.
> > > > > > Didn't know that json.net supported those attributes, nice tip!
> > > > > > However I'd prefer that the return binder could handle that, it
> would
> > > > > > be cleaner IMO...
> >
> > > > > > On Jun 21, 11:47 pm, John Simons <[email protected]>
> wrote:
> >
> > > > > > > Yes you are right you have to do an eval:
> > > > > > > $('#txtDate').val(eval(return.Date).toString()); <---- set
> datetime
> > > > > > > value to a text field
> >
> > > > > > > On Jun 22, 12:28 pm, Mauricio Scheffer <
> [email protected]>
> > > > > > > wrote:
> >
> > > > > > > > It contains date information, but it's not a Date object. You
> have to
> > > > > > > > parse it and convert it to a Date object in order to use it,
> unlike
> > > > > > > > other types in JSON.
> >
> > > > > > > > On Jun 21, 10:13 pm, John Simons <[email protected]>
> wrote:
> >
> > > > > > > > > Gabriel,
> >
> > > > > > > > > That is a javascript Date object.
> > > > > > > > > If you want to format the date object you can call any on
> the methods
> > > > > > > > > of the javascript Date object, eg:
> >
> > > > > > > > > Date myDate = new Date(1245531858000-0300);
> > > > > > > > > alert(myDate.toString());
> >
> > > > > > > > > Have a look at this onehttp://
> www.w3schools.com/jsref/jsref_obj_date.asp
> > > > > > > > > to see what methods the javascript date object has.
> >
> > > > > > > > > Cheers
> > > > > > > > > John
> >
> > > > > > > > > On Jun 21, 8:06 am, Gabriel Mancini de Campos
> >
> > > > > > > > > <[email protected]> wrote:
> > > > > > > > > > Hi Again Guys,
> >
> > > > > > > > > > Sorry my flood but i had a trouble, with jquery
> integration...
> > > > > > > > > > In my View i have some like this:
> >
> > > > > > > > > >  $('#btnList').click(function() {
> >
> > > > > > > > > >             ajaxOption = $.extend(ajaxOption, {
> > > > > > > > > >                 url: 'MyAction.mvc',
> > > > > > > > > >                 sucess: function(return) {
> > > > > > > > > >                     $('#txtDate').val(return.Date); <----
> set datetime
> > > > > > > > > > value to a text field
> > > > > > > > > >                 },
> > > > > > > > > >                 type: "Get"
> > > > > > > > > >             });
> >
> > > > > > > > > >             $.ajaxSetup(ajaxOption);
> > > > > > > > > >             $.ajax();
> > > > > > > > > >         });
> >
> > > > > > > > > > my Action like this:
> >
> > > > > > > > > > [AccessibleThrough(Verb.Post)]
> > > > > > > > > > [Rescue(typeof(RescueController), "JsonError")]
> > > > > > > > > > [return: JSONReturnBinder]
> > > > > > > > > > public Customer MyAction() {
> > > > > > > > > >    return repository.FindAll()[0];
> >
> > > > > > > > > > }
> >
> > > > > > > > > > and the return Json like this:
> >
> > > > > > > > > >
> [{"Campanha":"3","Canal":{"Descricao":"Loja","Id":1},"Data":"\/Date
> > > > > > > > > > (1245531858000-0300)\/"
> ,"Numero":"123412","NumeroParcelas":
> > > > > > > > > > 5,"PlanoFinanciamento":{"Descricao":"Plano
> 1","Id":1},"Produto":
> > > > > > > > > > {"Descricao":"Mastercard","Id":1}]
> >
> > > > > > > > > > "Data":"\/Date(1245531858000-0300)\/" <-------------
> WTF!!!
> >
> > > > > > > > > > any one knows how i show the true date????
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to