MVC modello condiviso diversi campi obbligatori su tipi diversi

4

Ho un modello chiamato Car e, a seconda del tipo di Car che l'utente seleziona, la vista è presentata in modo diverso. Ad esempio, l'utente seleziona da una griglia di auto diverse e, a seconda che si tratti di una Volvo o di una Kia o di una Ford, la vista deve consentire la modifica di diversi campi. Ad esempio con una Volvo il colore è modificabile ed è obbligatorio ma con un Kia non lo è.

Vorrei utilizzare la sola classe Car per associare la vista ma voglio che la convalida lato client raccolga i campi richiesti in base al tipo di macchina.

Voglio passare a un solo metodo di azione per l'aggiornamento

qual è un buon modo per affrontare questo problema ...? creare una classe base ed ereditarla? questo mi darà problemi vincolanti ..?

    
posta kurasa 27.04.2013 - 05:19
fonte

5 risposte

1

Lo stato dei campi è il dominio del tuo modello. La vista non dovrebbe avere assolutamente "intelligenza" al suo interno nel determinare lo stato abilitato o disabilitato dei suoi widget. Tutta la "logica" deve essere fornita dal modello stesso. Il legame dovrebbe essere fatto polimorficamente all'interno del modello, non della vista.

La vista deve essere in grado di richiedere queste informazioni in modo tale che una risposta polimorfica venga restituita dal modello.

ad esempio, questo metodo viene attivato dal modello quando il suo stato è cambiato. Fornisce ai suoi osservatori informazioni sull'Auto selezionata in modo polimorfico ...

Visualizzazione classe {

// view registers itself as a listener of model changes ...
Model.addModelStateListener(this);

// model has changed ... 
// Car instance can be a KIA, Ford or Volvo. Car is simply a common interface 
// and each instance defines its state differently

public void modelChanged(Car instance){
    ColorWidget.value = instance.getColorState();
}

}

    
risposta data 05.08.2013 - 08:05
fonte
0

Per garantire che la vista fornisca le giuste funzionalità, devi almeno estendere la classe Car con i metodi (a) che consentono alla vista di sapere se una determinata proprietà è obbligatoria / modificabile / presente.

All'interno del modello, questa informazione può essere generata dinamicamente in base ai valori di varie proprietà oppure è possibile utilizzare sottoclassi di Car per codificare le varie possibilità. Questa scelta dovrebbe essere basata principalmente su quanto siano fondamentali le differenze tra una Ford e una Volvo per il tuo modello. Non dovresti creare classi diverse solo per differenziare la modificabilità di alcune proprietà.

Inoltre, se vai per l'approccio della sottoclasse, ciascuna sottoclasse dovrebbe essere a conoscenza di tutte le proprietà supportate da tutte le altre sottoclassi, almeno nella misura in cui è in grado di gestire con garbo i tentativi di accesso / modifica non- proprietà esistenti o non modificabili.

    
risposta data 27.04.2013 - 08:51
fonte
0

Se parli in termini di mvc di asp.net, allora potresti voler creare un attributo personalizzato e inserire tutta la logica all'interno di quella classe e aggiungere il nome della classe come attributo ad una proprietà all'interno della tua classe di auto.

Questo link può aiutarti: come creare un attributo personalizzato

    
risposta data 26.07.2013 - 11:42
fonte
0

Se tutte le auto hanno le stesse proprietà e il medesimo comportamento, avrei una singola classe di macchina e implementerò l'interfaccia IValidatableObject. Nel metodo 'Validate' guarda il tipo di auto e aggiungi di conseguenza un errore.

Per quanto riguarda la convalida del lato client, dovrai implementare un validatore personalizzato in jQuery o una libreria di tua scelta. Personalmente uso KnockoutJS insieme al plugin di convalida KnockoutJS. Un semplice esempio può essere trovato qui: link

    
risposta data 04.10.2013 - 10:09
fonte
0

Ecco un modo per progettare questa funzione.

Classi

public class Car {}

public class Ford : Car {}

public class BMW : Car {}

Regolatore

public ActionResult Index()
{
    var car = new BMW();

    return View(car);
}

Quanto sopra è solo un codice di prova. Ora la parte fondamentale è questa. Nella cartella Views\Shared , crea una nuova cartella denominata EditorTemplates . In questa nuova cartella, crea due viste parziali:

Ford.cshtml

@model CarViews.Controllers.Ford

<p>This is a Ford</p>

bwm.cshtml

@model CarViews.Controllers.BMW

<p>This is a Bmw</p>

Quindi nella vista Indice puoi fare ciò:

@model CarViews.Controllers.Car

@Html.EditorFor(m => m)

A seconda del tipo di auto che passi, la vista dell'editor specifica per quel tipo sarà resa per te. Quando aggiungi nuove auto al sistema, devi semplicemente aggiungere nuovi file cshtml per quelle macchine.

    
risposta data 04.10.2013 - 14:24
fonte

Leggi altre domande sui tag