Asp.net-Mvc

如何排除某些公共屬性被序列化為 JsonResult?

  • January 7, 2022

我有一個使用 JsonResult 序列化的自定義視圖模型。ViewModel 有一些必須公開的屬性,但同時這些屬性在生成的 Json 輸出中不可見。

我已經嘗試過使用

$$ NonSerialized $$屬性,但這似乎沒有任何效果。 有什麼簡單的方法可以做到這一點嗎?還是我必須編寫自己的結果類型(在這種情況下我可能不會打擾)?

您可以[ScriptIgnore]在不應序列化的成員上放置一個屬性。有關範例,請參閱MSDN 中的 ScriptIgnoreAttribute 類

只需創建一個返回的介面而不是一個類。

public interface IMyViewModel {
  string MyPublicProperty { get; set; }
}

然後創建一個繼承介面的類

public class MyViewModel : IMyViewModel {
  public string MyPublicProperty { get; set; }
  public string MyNotSoPublicProperty { get; set; }
}

並在 Controller Action 中返回介面,而不是類

public JsonResult MyJson(){
   IMyViewModel model = new MyViewModel();
   return Json(model);
}

生成的 JSON 將是

{
   'MyPublicProperty': ''
}

客戶端腳本的挑戰之一是,如果您正在更改您的類,您不知道您是否正在破壞客戶端實現。如果您在 JSON 中使用介面類型,您就會明白,如果您更改介面,您所做的事情可能會扼殺客戶端的實現。如果您要更改不在介面中的內容(因此不會被序列化),它還可以避免您徒勞地重複檢查客戶端。

此外,很多時候,您的 ViewModel 中可能包含您不一定想要輸出到客戶端的大型集合或複雜類型。這些可能需要很長時間來序列化或公開根本不屬於客戶端程式碼的資訊。使用介面將使了解輸出中的內容更加透明。

此外,使用諸如

$$ ScriptIgnore $$on a property 僅適用於特定場景(JavaScript 序列化),如果您稍後序列化為 XML,則迫使您面臨完全相同的問題。這將不必要地用大量屬性亂扔您的視圖模型。你真的想要幾個在那裡?使用介面適用於任何地方,並且不需要在視圖模型中添加額外的屬性。

引用自:https://stackoverflow.com/questions/1428585