2014-02-20 84 views
3

我使用ASP.NET MVC C#與HTML CSS jQuery KnockoutJs前端。NewtonSoft Json DeserializeObject空Guid字段

我在我的HTML頁面上有模態聯繫表單。這個想法是,如果我創建一個新的聯繫人模式窗體彈出空白值包括一個空白的隱藏ID字段。

如果我編輯一個聯繫人,那麼模式表單會彈出填充字段,包括隱藏的id字段。

在我的控制,我打算這樣做:

public JsonResult Contact(string values) 
{ 
    var contact = JsonConvert.DeserializeObject<contact>(values); 

    if (contact.Id.Equals(Guid.Empty)) 
    { 
     // create a new contact in the database 
    } else 
    { 
     // update an existing one 
    } 
} 

不過,我得到一個錯誤,指出can't convert "" to type Guid

你如何解決這個問題有NewtonSoft JSON,我已經在看着here自定義JsonConverter它似乎是沿着正確的路線,但我不知道該去哪裏。

+0

您是否嘗試過製作'contact.Id'屬性爲空的?這可能會解決它。 –

+0

我使用數據庫中使用的「Contact」模型,因此使它可爲空將會很糟糕。 –

回答

6

一個自定義轉換器看起來像這樣,但我覺得這對一些如此微不足道的東西有點矯枉過正。

/// <summary> 
/// Converts a <see cref="Guid"/> to and from its <see cref="System.String"/> representation. 
/// </summary> 
public class GuidConverter : JsonConverter 
{ 
    /// <summary> 
    /// Determines whether this instance can convert the specified object type. 
    /// </summary> 
    /// <param name="objectType">Type of the object.</param> 
    /// <returns>Returns <c>true</c> if this instance can convert the specified object type; otherwise <c>false</c>.</returns> 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsAssignableFrom(typeof(Guid)); 
    } 

    /// <summary> 
    /// Reads the JSON representation of the object. 
    /// </summary> 
    /// <param name="reader">The <see cref="JsonReader"/> to read from.</param> 
    /// <param name="objectType">Type of the object.</param> 
    /// <param name="existingValue">The existing value of object being read.</param> 
    /// <param name="serializer">The calling serializer.</param> 
    /// <returns>The object value.</returns> 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     try 
     { 
      return serializer.Deserialize<Guid>(reader); 
     } 
     catch 
     { 
      return Guid.Empty; 
     } 
    } 

    /// <summary> 
    /// Writes the JSON representation of the object. 
    /// </summary> 
    /// <param name="writer">The <see cref="JsonWriter"/> to write to.</param> 
    /// <param name="value">The value.</param> 
    /// <param name="serializer">The calling serializer.</param> 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 
} 

用法:

class Contact 
{ 
    [JsonConverter(typeof(GuidConverter))] 
    public Guid Id { get; set; } 
} 

或者:

var contact = JsonConvert.DeserializeObject<contact>(values, new GuidConverter()); 

編輯

我相信,你的JSON看起來像這個有很多:

{ 
    "id": "", 
    "etc": "..." 
} 

的問題很可能是固定的,如果你能做到這一點,而不是:

{ 
    "id": null, 
    "etc": "..." 
} 
+0

現在就進行測試 –

+0

本質上,它所做的就是將默認轉換器包裝在一個'try-catch'塊中。如果轉換失敗,它默認爲'Guid.Empty'。不是最有效的解決方案。例如,你可以使用'String.IsNullOrEmpty()'來避免第一個異常。 –

+1

最好的解決方案是根本不包括JSON數據中的'Id'屬性。你能做到嗎? –