Eksperymentowałem z tworzeniem strony internetowej, która wykorzystuje MVC z JSON dla mojej warstwy prezentacji i frameworku Entity dla modelu danych / bazy danych. Mój problem wchodzi w grę z serializowaniem obiektów Model do JSON.
Korzystam z pierwszej metody kodu, aby utworzyć bazę danych. Podczas wykonywania pierwszej metody kodu relacja jeden do wielu (rodzic / dziecko) wymaga, aby dziecko miało odwołanie do rodzica. (Przykładowy kod może być literówką, ale masz obraz)
class parent
{
public List<child> Children{get;set;}
public int Id{get;set;}
}
class child
{
public int ParentId{get;set;}
[ForeignKey("ParentId")]
public parent MyParent{get;set;}
public string name{get;set;}
}
Podczas zwracania obiektu „nadrzędnego” przez JsonResult generowany jest błąd odwołania cyklicznego, ponieważ „dziecko” ma właściwość nadrzędnej klasy.
Próbowałem atrybutu ScriptIgnore, ale tracę możliwość patrzenia na obiekty potomne. W pewnym momencie będę musiał wyświetlić informacje w widoku nadrzędnego dziecka.
Próbowałem utworzyć klasy podstawowe zarówno dla rodzica, jak i dziecka, które nie mają odwołania cyklicznego. Niestety, kiedy próbuję wysłać baseParent i baseChild, są one odczytywane przez JSON Parser jako ich pochodne klasy (jestem prawie pewien, że ta koncepcja mi ucieka).
Base.baseParent basep = (Base.baseParent)parent;
return Json(basep, JsonRequestBehavior.AllowGet);
Jedynym rozwiązaniem, które wymyśliłem, jest stworzenie modeli „Widok”. Tworzę proste wersje modeli baz danych, które nie zawierają odwołania do klasy nadrzędnej. Każdy z tych modeli widoków ma metodę zwracania wersji bazy danych i konstruktora, który przyjmuje model bazy danych jako parametr (viewmodel.name = databasemodel.name). Ta metoda wydaje się wymuszona, chociaż działa.
UWAGA: Piszę tutaj, ponieważ uważam, że jest to bardziej warte dyskusji. Mógłbym wykorzystać inny wzorzec projektowy, aby rozwiązać ten problem, lub może to być tak proste, jak użycie innego atrybutu w moim modelu. Podczas poszukiwań nie widziałem dobrej metody rozwiązania tego problemu.
Moim celem końcowym byłoby stworzenie ładnej aplikacji MVC, która mocno wykorzystuje JSON do komunikacji z serwerem i wyświetlania danych. Utrzymując spójny model na warstwach (lub najlepiej, jak mogę to wymyślić).