Quindi in pratica ho un oggetto con alcune proprietà al suo interno:
public MyObject
{
public string Name {get;set;}
public bool Complete {get; set;}
}
List<MyObject> myList = new List<MyObject>();
myList.Add(new MyObject("Page1", true));
myList.Add(new MyObject("Page2", false));
myList.Add(new MyObject("Page3", false));
Immagina una pagina web. Carica l'elenco di pagine sopra dal database e quindi visualizza un collegamento a ciascuna di esse.
Le pagine devono essere completate in ordine. Quindi se una pagina non è completa, la prossima pagina non può essere modificata.
Quindi in questo caso la pagina 1 è già completa. Pagina2 può essere modificato / completato. La pagina 3 non può essere modificata fino a quando la pagina 2 non è stata completata.
Sto cercando di decidere il modo migliore per implementare - Ho 3 opzioni che sto cercando di decidere tra:
1) Modifica query del database: la query corrente contiene il nome e il flag completo. Stavo pensando di aggiungere un nuovo flag che tirerà il valore dalla riga precedente, in questo modo:
SELECT Name, Complete, LAG(Complete) OVER (ORDER BY 1) as Editable
FROM @MyPages ORDER BY 1
Ma ciò è al limite della logica aziendale nel database. Mi è stato detto che è cattivo .
2) Modificare la visualizzazione della pagina Web (pagina MVC)
Il modo più semplice. Durante il looping dell'elenco, controlla la riga precedente.
Ma mi viene anche detto che la logica di business nella vista è cattiva .
3) Una sorta di nuovo modello di vista. Ma dal momento che la proprietà dipende dall'oggetto precedente in una lista, sto cercando di trovare un modo "carino" per farlo.
I migliori sono riuscito finora ...
public class MyViewModel
{
public List<MyObject> _list;
public bool IsEditable(int index)
{
if (index > 0)
{
if (this._list[index-1].Complete)
return true;
return false;
}
else
return true;
}
}
Tutti e 3 funzioneranno.
Ma recentemente ho fatto uno sforzo maggiore per fare le cose 'correttamente' piuttosto che semplicemente hackerare insieme il più veloce o la prima cosa a cui penso.
-
O sto meglio demolendo l'intero oggetto e partendo da zero?
Ho già la lista delle pagine prese dal database che andava bene quando volevamo mostrare tutto e trattarli allo stesso modo. Ora è tutto rovinato ..