Domanda

In primo luogo, portare con me qui. Ho un modello personalizzato legante che è la mappatura con successo dati del modulo a un oggetto personalizzato. All'interno di questo modello legante si associa anche oggetti di forma diversa per oggetto personalizzato. Quello che sento che dovrei essere in grado di fare è creare un legante modello separato per prendersi cura di questa seconda mappatura. Questa è una versione semplificata.

Gli oggetti personalizzati:

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    public string Description { get; set; }
    public IEnumerable<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Status { get; set; }
}

Se il mio modulo passa indietro un mucchio di Ids per le sottocategorie, quello che dobbiamo fare è correre fuori al repository di dati e idratare l'oggetto sottocategoria. Dalla forma, un elenco di sottocategorie sarà presentato nel seguente formato:

<input type="text" name="Name" value="This Category" />

<input type="hidden" name="subcat.Index" value="0" />
<select name="subcat[0].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="1" />
<select name="subcat[1].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="2" />
<select name="subcat[2].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

Scrivi personalizzato per mappare Categoria è ovviamente semplice, scrivendo il modello legante che a sua volta mappare la sottocategoria (all'interno del modello legante vorrei correre fuori una query mio repository di dati) si sta rivelando un po 'difficile.

Non sono sicuro di come chiara ho fatto questa, le scuse, grazie per la lettura e per favore fatemi sapere se c'è qualcosa che posso dire per rendere questo più chiaro!

È stato utile?

Soluzione

Il mio prendere su questo è che modello raccoglitori devono essere la costruzione di modelli di presentazione, non tipi di entità dal repository. Il modello legante dovrebbe essere molto semplice mappatura della collezione chiave / valore della forma ad un modello di presentazione, che è in gran parte i valori scalari con eventuali piccoli relazioni con altri tipi che sono per lo più valori scalari o elenchi. Avendo a materializzarsi istanze di entità da un repository aggiunge un sacco di complicazioni, come avete trovato.

Inoltre, è inutile. Utilizzando un modello di presentazione ha un gran numero di vantaggi, tra cui:

  • Non c'è mai la necessità di whitelist i campi l'utente è autorizzato ad aggiornare, in quanto il modello presentazione contiene solo quei campi.
  • Il legante modello predefinito funziona per tutti, ma gli scenari vincolanti modello più complessa. In pratica, trovo che ho solo bisogno di utilizzare un modello personalizzato raccoglitore quando il valore che l'utente vede deve essere legato a qualche altro valore in modo condizionale. Quando si utilizza un modello di presentazione della struttura del modello presentazione dovrebbe corrispondere alla struttura della pagina, in modo da non essere necessario utilizzare un modello personalizzato legante per ragioni strutturali.
  • Si sarà in grado di creare i punti di vista e controller prima di creare un modello di database o entità. Ciò significa che è possibile ottenere clienti buy-in sul vostro disegno prima di fare una grande quantità di lavoro per creare il sistema finale. Questo aiuta a risolvere i problemi strutturali del modello di entità prima che accadano. Basta creare un modello di presentazione, che corrisponde alla pagina si ritiene che il cliente vuole vedere, costruire il quadro generale della pagina utilizzando un'istanza made-up di questo modello di presentazione, e mostrare al cliente. Se sono felice, si può quindi costruire l'/ modello di entità repository e scrivere una query LINQ per mappare che al modello di presentazione.

Quindi nel tuo esempio, le sottocategorie sarebbe venuto in dalla collezione modulo come una lista di numeri interi. Pertanto, il modello di presentazione dovrebbe avere lo stesso elenco di numeri interi. Nel controllore, dopo il legame, è possibile chiamare un metodo per trasferire i valori del modello dal modello di presentazione a un'istanza di categoria materializzato dal repository.

Altri suggerimenti

Consiglio di prendere un'occhiata a questo canto Eels posta , che dà una esempio di un altro approccio. Utilizzando l'approccio del campione StatefulObjectBinder, è possibile legare le collezioni di oggetti di business che devono essere recuperati dal database. Poiché il regolatore sta attuando IModelBinder, si ha accesso a un repository, che può essere utilizzato per idratare gli oggetti necessari e aggiungerli alla collezione oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top