Utilizzo di ASP.NET MVC, come evitare di scrivere sia la vista Aggiungi che la vista Modifica?


13

La vista Aggiungi e la vista Modifica sono spesso incredibilmente simili che non è giustificato scrivere 2 viste. Man mano che l'app si evolverà, farai le stesse modifiche ad entrambi.

Tuttavia, di solito ci sono sottili differenze. Ad esempio, un campo potrebbe essere di sola lettura una volta che è stato aggiunto e se tale campo è un DropDownList non è più necessario quell'elenco nel ViewData.

Quindi, dovrei creare una classe dati di visualizzazione che contenga tutte le informazioni per entrambe le viste, dove, a seconda dell'operazione che stai eseguendo, alcune proprietà saranno nulle?
Devo includere l'operazione nei dati della vista come enum?
Devo circondare tutte le differenze sottili con <% se (ViewData.Model.Op == Ops.Editing) {%>?

O c'è un modo migliore?

  0

Sì! Sarebbe bello poter usare la stessa vista per: Aggiungi, Modifica e Visualizza ... 14 nov. 082008-11-14 17:56:24

4

Non mi piace che le viste diventino troppo complesse e finora ho avuto la tendenza ad avere viste separate per Modifica e Aggiungi. Uso un controllo utente per memorizzare gli elementi comuni per evitare la ripetizione. Entrambe le viste saranno centrate attorno allo stesso ViewData e ho un indicatore sui miei dati per dire se l'oggetto è nuovo o un oggetto esistente.

Questo non è più elegante di quello che hai stipulato, quindi mi chiedo se qualcuno dei ragazzi di Django o Rails possa fornire alcun input.

Amo il mvc di asp.net ma è ancora in fase di maturazione e ha ancora bisogno di più zucchero per eliminare alcuni degli attriti della creazione di siti Web.


2

Personalmente preferisco semplicemente usare l'if/else proprio lì nella vista. Mi aiuta a vedere tutto in una volta.

Se si vuole evitare la zuppa tag, suggerirei di creare un metodo di supporto.

<%= Helper.ProfessionField() %> 

string ProfessionField() 
{ 
    if(IsNewItem) { return /* some drop down code */ } 
    else { return "<p>" + _profession+ "</p>"; }   
} 

5

È davvero facile davvero. Supponiamo che tu stia modificando un post sul blog.

Ecco la tua 2 azioni per nuovi/edit:

public class BlogController : Controller 
{ 
    public ActionResult New() 
    { 
     var post = new Post(); 
     return View("Edit", post); 
    } 

    public ActionResult Edit(int id) 
    { 
     var post = _repository.Get(id); 
     return View(post); 
    } 

    .... 

} 

Ed ecco la vista:

<% using(Html.Form("save")) { %> 
<%= Html.Hidden("Id") %> 

<label for="Title">Title</label> 
<%= Html.TextBox("Title") %> 

<label for="Body">Body</label> 
<%= Html.TextArea("Body") %> 

<%= Html.Submit("Submit") %> 
<% } %> 

Ed ecco l'azione Salva che la vista sottomette:

public ActionResult Save(int id, string title, string body) 
{ 
    var post = id == 0 ? new Post() : _repository.Get(id); 
    post.Title = title; 
    post.Body = body; 

    _repository.Save(post); 

    return RedirectToAction("list"); 
} 
  0

Invece di ripubblicare esattamente quello che hai fatto, ti suggerisco di modificare la tua risposta per includere un esempio di commutazione di un campo in sola lettura sullo schermo di modifica, come richiesto dalla domanda originale. 11 dic. 092009-12-11 13:55:54


1

È possibile specificare una classe CustomViewData e passare qui i parametri.


public class MyViewData { 
    public bool IsReadOnly { get; set; } 
    public ModelObject MyObject { get; set; } 
} 

E entrambe le viste dovrebbero attuare questo Viewdata. Come risultato è possibile utilizzare la proprietà IsReadOnly fornita per gestire il risultato UserControl.

Come il controller utilizza questo, è possibile testare l'unità e le visualizzazioni non hanno implementazione, quindi è possibile rispettare i principi MVC.