Verwenden von ASP.NET MVC, um zu vermeiden, sowohl die Ansicht hinzufügen und bearbeiten Ansicht zu schreiben?


13

Die Ansicht hinzufügen und die Ansicht Bearbeiten sind oft unglaublich ähnlich, dass es ungerechtfertigt ist, 2 Ansichten zu schreiben. Mit der Weiterentwicklung der App würden Sie die gleichen Änderungen an beiden vornehmen.

Allerdings gibt es normalerweise subtile Unterschiede. Zum Beispiel könnte ein Feld schreibgeschützt sein, sobald es hinzugefügt wurde, und wenn dieses Feld eine DropDownList ist, brauchen Sie diese Liste nicht mehr in ViewData.

Also, sollte ich eine Sicht Datenklasse erstellen, die alle Informationen für beide Ansichten enthält, wo, abhängig von der Operation, die Sie ausführen, bestimmte Eigenschaften null sein werden?
Sollte ich die Operation in den Ansichtsdaten als Aufzählung einschließen?
Sollte ich alle feinen Unterschiede mit <% If umgeben (ViewData.Model.Op == Ops.Editing) {%>?

Oder gibt es einen besseren Weg?

  0

Yeah! Es wäre schön, dieselbe Ansicht für Folgendes verwenden zu können: Hinzufügen, Bearbeiten und Anzeigen ... 14 nov. 082008-11-14 17:56:24

4

Ich mag nicht die Ansichten zu komplex werden, und bisher habe ich tendenziell separate Ansichten für Bearbeiten und Hinzufügen. Ich verwende ein Benutzersteuerelement, um die gemeinsamen Elemente zu speichern, um Wiederholungen zu vermeiden. Beide Ansichten werden um die gleichen ViewData zentriert, und ich habe eine Markierung auf meinen Daten, um zu sagen, ob das Objekt neu oder ein existierendes Objekt ist.

Das ist nicht eleganter als das, was Sie festgelegt haben, also frage ich mich, ob irgendwelche der Django oder Rails Jungs irgendwelche Eingaben liefern können.

Ich liebe asp.net mvc, aber es ist immer noch reif, und braucht noch mehr Zucker hinzufügen, um etwas von der Reibung der Erstellung von Websites wegzunehmen.


2

Ich persönlich bevorzuge lieber das if/else direkt dort in der Ansicht. Es hilft mir, alles sofort im Blick zu haben.

Wenn Sie das Tag Suppe vermeiden möchten, würde ich vorschlagen, eine Hilfsmethode zu erstellen.

<%= Helper.ProfessionField() %> 

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

5

Es ist ziemlich einfach wirklich. Nehmen wir an, Sie bearbeiten einen Blogpost.

Hier ist Ihre 2 Aktionen für neue/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); 
    } 

    .... 

} 

Und hier ist die Ansicht:

<% 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") %> 
<% } %> 

Und hier ist die Save Aktion, die die Ansicht unterbreitet:

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

Anstatt genau das, was Sie getan haben, erneut zu veröffentlichen, könnte ich Ihnen vorschlagen, Ihre Antwort so zu bearbeiten, dass ein Feld auf dem Bearbeitungsbildschirm als schreibgeschützt markiert wird, wie es bei der ursprünglichen Frage der Fall war. 11 dez. 092009-12-11 13:55:54


1

Sie können eine CustomViewData-Klasse angeben und die Parameter hier übergeben.


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

Und beide Ansichten sollten diese ViewData implementieren. Als Ergebnis können Sie die bereitgestellte IsReadOnly-Eigenschaft zum Verwalten des UserControl-Ergebnisses verwenden.

Da der Controller dies verwendet, können Sie es testen, und Ihre Ansichten haben keine Implementierung, so dass Sie die MVC-Prinzipien einhalten können.