Domanda

Ho una classe View (OrderView.aspx) che mostra i dettagli di un ordine (Nome account, Data ordine) nonché un elenco di righe ordine tramite il controllo Repeater. Ogni riga ordine è rappresentata da una vista controllo utente (OrderLineView.ascx) che mostra i dettagli della riga ordine (Nome articolo, Quantità, Prezzo). Ho un oggetto modello chiamato Ordine che utilizzo come origine dati per tutto ciò, che passo come oggetto modello per la vista.

Ogni controllo utente OrderLineView ha un pulsante Salva e un pulsante Elimina. Ho il pulsante Salva che registra il contenuto di un modulo nel controllo OrderLine in un metodo Save sul controller e quindi RedirectToAction nella stessa pagina Ordine (questo aggiorna l'intera pagina, nulla di AJAXy al riguardo). Ho il pulsante Elimina collegato a un metodo sul Controller che tenta di eliminare, quindi RedirectToAction torna alla stessa pagina Ordine. Se l'eliminazione non riesce, tuttavia, desidero che venga visualizzato un piccolo messaggio di errore accanto al pulsante Elimina quando la pagina viene nuovamente visualizzata (ricorda, c'è un pulsante Elimina per ogni riga dell'ordine sulla pagina, quindi voglio solo il messaggio accanto a quello su cui ho cliccato). Le mie domande:

1 - Come posso passare questi dati dal mio metodo Controller al controllo utente specifico? Dovrei in qualche modo aggiungerlo al modello? Sembra una cattiva idea (dal momento che in realtà non fa parte del modello).

2 - Dovrei avere un OrderLineController per le operazioni OrderLine e un OrderController per le operazioni Order? Voglio solo sapere se la migliore pratica è avere un controller separato per ogni vista.

3 - Ho visto come alcune persone potrebbero chiamare RedirectToAction con un valore di tipo anonimo come questo:

RedirectToAction("ViewOrder", new { Id = 1234, Message = "blabla"});

ma questo fa apparire il valore del messaggio nella stringa URL. Sono d'accordo con quello, ma preferirei che non si mostri se possibile.

4 - Inoltre, per accedere alle proprietà del Modello dall'interno della vista, mi ritrovo a farlo sempre:

foo(((someModelType) this.ViewData.Model).SomeProperty);

Non mi piace per una serie di motivi, uno dei quali è il fatto che non voglio che la mia vista sia accoppiata al tipo del mio modello (motivo per cui sto usando ViewPage invece di ViewPage) . Preferirei di gran lunga essere in grado di ricevere una chiamata come questa:

foo(ModelEval("SomeProperty"));

Esiste una cosa del genere? Ho scritto il mio, ma mi piacerebbe se non fosse necessario.

È stato utile?

Soluzione

1

Scopri ModelState.

ViewData.ModelState.AddModelError("something.Name", "Please enter a valid Name");

ModelState è in realtà un dizionario, quindi è possibile identificare gli errori in base al controllo. Non so se questa è una buona pratica, ma probabilmente funzionerebbe. Prova qualcosa del genere

ViewData.ModelState.AddModelError("something#3.Name", "Please enter a valid Name");

e dal tuo punto di vista, potresti mettere

<%= Html.ValidationMessage(string.format({"something{0}.Name", YourUniqueId))%>

4

Puoi digitare fortemente la tua vista, quindi non hai bisogno di quel cast, ma se sei preoccupato per l'accoppiamento stretto, questo potrebbe scoraggiarti. Ma avere il tipo forte non è più strettamente accoppiato che avere una stringa magica che punta comunque a quella proprietà del modello. Il primo ti dà solo la sicurezza del tipo e la gloria che è l'intellisenso.

Altri suggerimenti

Poiché OrderLine ha un ID univoco, è possibile utilizzarlo per costruire una chiave da inserire nel contenitore degli errori ModelState.

public ActionResult Delete(int? Id)
{
    ModelState.AddModelError("OrderLine" + Id.Value, "Error deleting OrderLine# " + Id.Value);

    ...    
}

e quindi utilizzare l'helper ValidatinoMessage. Questo controllerà ModelState per vedere se esiste un errore e se lo fa visualizzerà il messaggio. Altrimenti è vuoto.

<%= Html.ValidationMessage ("OrderLine" + Id)%>

Nella prossima versione di MVC Model diventerà una proprietà di livello superiore, quindi la seguente

foo(((someModelType) this.ViewData.Model).SomeProperty);

può essere scritto come

foo(Model.SomeProperty);

Gli oggetti modello devono essere già digitati a meno che non si stia utilizzando oggetto pubblico come proprietà?

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