2012-03-02 99 views
3

我有上有一些雙屬性的模型,並與他們來到其將雙成一個不錯的可讀性%的DisplayFormat ..例如MVC3模型DisplayFormat和JSON

[DisplayFormat(DataFormatString = "{0:P2}")] 
public Nullable<double> Yearly_act_pct { get; set; } 

這在HTML工作正常諧音,我包裹呼叫

@Html.DisplayFor(modelItem => item.Yearly_act_pct) 

然而,當我轉儲一些對象成JSON飼料的DisplayFormats似乎被忽略,所以我結束了原始小數,常大的。

我怎樣才能讓這個

return Json(myObjects, JsonRequestBehavior.AllowGet); 

尊重DisplayFormats?

回答

2

致電return Json(myObjects, JsonRequestBehavior.AllowGet)實際返回JsonResult。該JsonResult的內部進行通話:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
response.Write(serializer.Serialize(Data)); 

如果你看一下MSDN爲JavascriptSerializer你將有一個簡單的轉換。此實現似乎不符合DisplayFormat。

您可以編寫一個從JsonResult派生的類,該類尊重DisplayFormat屬性。

+0

以編程方式,如何讀取其屬性的DisplayFormat設置的對象? – 2012-03-02 20:48:52

1

DataAnnotations命名空間屬性將僅處理動態數據控件和顯示格式。在將對象傳遞給Json()方法之前,你需要做的只是一些基本的四捨五入。像這樣的東西就夠了:

myObjects.Yearly_act_pct = Math.Round(myObjects.Yearly_act_pct, 2); // provided you wanted to round to nearest two fractional digits 
return Json(myObjects, JsonRequestBehavior.AllowGet); 

這會給你的「小雙」的價值,但你還是傳遞double,不是string,可以是一個格式化double。不知道這是否合理,但doubledouble,並且您可以做的最好的做法是對其進行四捨五入以避免出現過多的小數位數。

1

一說在需要的時候來定製的輸出格式,序列化工作時,人們已經用變通的就是創建一個字符串屬性:

[DataMember(Name = "price", Order = 23)] 
    [XmlElement("price", Order = 23)] 
    public string Price_String 
    { 
     get 
     { 
      return Formatter.FormatAsCurrency(this.Price); 
     } 
     set 
     { 
      this.Price = Formatter.ParseCurrency(value); 
     } 
    } 

    [XmlIgnore] 
    public decimal Price { get; set; } 

格式化爲一個自定義類我有HANDELS解析/格式化爲特定的類型。這是不相關的,但我會包括他們:

public static string FormatAsCurrency(decimal? amount) 
    { 
     return amount.HasValue ? String.Format("{0:C}USD", amount).Replace("$","") : null; 
    } 
    public static decimal ParseCurrency(string value) 
    { 
     return !String.IsNullOrEmpty(value) ? decimal.Parse(value.Replace("USD", "")) : 0; 
    } 
    public static decimal? ParseNullableCurrency(string value) 
    { 
     return !String.IsNullOrEmpty(value) ? decimal.Parse(value.Replace("USD", "")) as decimal? : null; 
    } 

在我的例子,我打上了我的兩個DataContract和XML序列化的屬性。這並不理想,但當時是唯一的解決方法。

我也是在我的控制器中創建一個方法返回一個響應「

public ContentResult GetContentResult(object responseObject) 
    { 
     #region Output Format 
     if (this.ResponseFormat == ResponseFormatEnum.JSON) 
     { 
      string json = ""; 

      try 
      { 
       System.Runtime.Serialization.Json.DataContractJsonSerializer jsonserializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(responseObject.GetType()); 
       MemoryStream ms = new MemoryStream(); 
       jsonserializer.WriteObject(ms, responseObject); 
       json = Encoding.Default.GetString(ms.ToArray()); 
       ms.Close(); 
       ms.Dispose(); 
       jsonserializer = null; 
      } 
      catch(System.Exception ex) 
      { 
       string err = ex.Message; 
      } 

      return new ContentResult() { Content = json, ContentType = "application/json" }; 

     } 
     else 
     { 
      string xml = ""; 
      try 
      { 
       MemoryStream ms = new MemoryStream(); 
       System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(responseObject.GetType()); 
       System.Xml.Serialization.XmlSerializerNamespaces ns = new System.Xml.Serialization.XmlSerializerNamespaces(); 
       ns.Add("", ""); 
       ms = new MemoryStream(); 
       serializer.Serialize(ms, responseObject, ns); 
       xml = Encoding.Default.GetString(ms.ToArray()); ms.Close(); 
       ms.Dispose(); 
       serializer = null; 
      } 
      catch (System.Exception ex) 
      { 
       throw ex; 
      } 

      return new ContentResult() { Content = xml, ContentType = "text/xml" }; 
     } 
     #endregion 
    } 

,並使用它:

public ActionResult Feed() 
    { 
     ViewModels.API.Deals.Response response = new ViewModels.API.Deals.Get(); 
     return GetContentResult(response);    
    } 

我的例子是有點比更復雜的是你正在使用,但它作品(對於XML和JSON)