Wystarczy utworzyć interfejs, aby powrócić zamiast klasy.
public interface IMyViewModel {
string MyPublicProperty { get; set; }
}
Następnie należy utworzyć klasę, która dziedziczy jest przez urządzenie
public class MyViewModel : IMyViewModel {
public string MyPublicProperty { get; set; }
public string MyNotSoPublicProperty { get; set; }
}
i powrócić do interfejsu, a nie klasy, w akcji kontrolera
public JsonResult MyJson(){
IMyViewModel model = new MyViewModel();
return Json(model);
}
i otrzymaną JSON będzie
{
'MyPublicProperty': ''
}
Jednym z wyzwań w skryptach po stronie klienta jest to, że jeśli zmieniasz swoje zajęcia, nie masz pojęcia, czy niszczysz implementację po stronie klienta, czy też nie. Jeśli używasz typów interfejsu w swoim JSON, rozumiesz, że jeśli zmienisz interfejs, robisz coś, co potencjalnie może zabijać implementację po stronie klienta. A także oszczędza od podwójnego sprawdzania strony klienta na próżno, jeśli zmieniasz coś, co NIE jest w inteface (w związku z tym nie jest serializowane).
Również wiele razy Twoje modele ViewModels mogą zawierać duże kolekcje lub złożone typy, które niekoniecznie muszą być wyprowadzane na kliencie. Może to zająć dużo czasu serializacji lub ujawnienia informacji, które po prostu nie należą do kodu klienta. Używanie interfejsów sprawi, że będzie on bardziej przejrzysty, aby wiedzieć, co jest na wyjściu.
Ponadto użycie atrybutów takich jak [ScriptIgnore] w usłudze ma zastosowanie tylko do określonego scenariusza (szeregowania JavaScript), który zmusza do stawienia czoła dokładnie temu samemu problemowi, na przykład w przypadku późniejszego serializowania do formatu XML. To niepotrzebnie zaśmieciłoby twoje modele widoków tonami atrybutów. Ilu z nich naprawdę chcesz tam? Używanie intefaces ma zastosowanie wszędzie, a żaden moduł viewmodel nie musi być zaśmiecony dodatkowymi atrybutami.
Większość odpowiedzi polega na użyciu atrybutów lub wrappów. Chcę po prostu wyłączyć niektóre właściwości publiczne podczas serializacji. Szukam JSON.NET zgodnie z sugestią @Charlino, ale nie znalazłem sposób. Jest tak w przypadku: Mam właściwość 'Błąd', która będzie ustawiona tylko w przypadku wystąpienia błędu. strona klienta sprawdzi, czy pierwsza wyświetla komunikat, w przeciwnym razie wyświetli resztę właściwości Model. Gdy nie ma błędu, wyrenderuje '{...," Error ": null}'! – CallMeLaNN