2016-10-03 1 views
0

Ich muss nur wissen, ob dies möglich ist oder was genau Standard in MVC ist, da dies meine erste groß angelegte MVC-Anwendung ist.Verwenden von ViewModel zum Einrichten von MVC Form, aber Bindung an Objekt des Ansichtsmodells im Postback. Ist das möglich?

So habe ich eine Form Ich möchte der Benutzer alle notwendigen Daten in der Lage sein, zu bearbeiten und auf dem Formular Seite zu ziehen, ich brauche ich in einem Viewmodel, bin die

public class Tier2IssueFormViewModel 
{ 
    public Tier2IssueDTO Tier2Issue { get; set; } 
    public IEnumerable<SelectListItem> VersionList { get; set; } 
    public IEnumerable<SelectListItem> BugList { get; set; } 
    public IEnumerable<SelectListItem> IssueStatusList { get; set; } 
} 

Dann einmal habe ich das Sammeln der Formulardaten vom Benutzer fertig mit Dingen wie,

@Html.TextBoxFor(m => m.Tier2Issue.Tier2Notes, new { @class = "form-control"}) 
@Html.DropDownListFor(m => m.Tier2Issue.FishbowlVersion, Model.VersionList, "Select Application Version") 
@Html.HiddenFor(m => m.Tier2Issue.ID) 

ich möchte für mein Modell zu binden, mit der folgenden Signatur zu dieser Aktion posten

[HttpPost] 
[Route("Issues/{id}/Edit")] 
public ActionResult EditIssue(Tier2IssueDTO model) 
{ 
    ... 
    // Update DB with the DTO model 
    ... 
} 

Aber bis jetzt ist nichts wirklich an dieses Objekt gebunden. Ich dachte, das Modellbinder könnte schlau genug sein, um die beiden zu paaren, aber ich vermute, dass diese Logik falsch ist. So bin ich zur Zeit eine Abhilfe tun dies durch die Verwendung

[HttpPost] 
[Route("Issues/{id}/Edit")] 
public ActionResult EditIssue(Tier2IssueFormViewModel model) 
{ 
    ... 
    // Get Tier2IssueDTO values from viewmodel 
    // Update DB with the DTO model 
    ... 
} 

Ich meine, es funktioniert, aber es scheint seltsam für mich, dass Sie binden an einem View-Modell modellieren würde. Ist das Standardverfahren oder gibt es eine Möglichkeit, direkt an ein Objekt zu binden, das im Viewmodel enthalten ist?

+0

Das funktioniert Das Modell in der Ansicht ist 'Tier2IssueFormViewModel' und Ihre' HtmlHelper' Methoden erzeugen basierend auf diesem Modell Formular-Steuerelemente, nicht 'Tier2IssueDTO' (schauen Sie sich die' name' Attribute Ihres Generators an), damit es nicht an 'Tier2IssueDTO' binden kann. Obwohl Sie die 'Prefix'-Eigenschaft von' BindAttribute' verwenden könnten, tun Sie dies trotzdem nicht richtig. Ein Ansichtsmodell sollte keine Datenmodelle enthalten, insbesondere beim Bearbeiten von Daten. –

+0

@StephenMuecke Wenn Sie keine Datenmodelle im Ansichtsmodell haben sollten, wie zeige ich die Daten für ein Objekt an, das bearbeitet werden soll? Ich meine, das Objekt hat bereits Werte und so bekomme ich diese Werte zur Anzeige und später zur Änderung. Was ist die Alternative? – tokyo0709

+0

Das Ansichtsmodell sollte Eigenschaften des Datenmodells enthalten, das Sie bearbeiten möchten (nicht das Datenmodell selbst) sowie Ihre Auswahllisten usw. - [Was ist ViewModel in MVC?] (Http://stackoverflow.com/questions/11064316/what -is-viewmodel-in-mvc) –

Antwort

1

Das wird nicht funktionieren, weil das Texteingabefeld Namen aus dem Modell in Ihrer Aktion differnt sind, ex: das Textfeld einen Namen Tier2Issue.Tier2Notes während des Modellparameter in Ihrer Aktion einen Eigenschaftsnamen Tier2Notes nur ohne die Tier2Issue erwartet Präfix.

Sie dieses Problem, indem entweder machen das Modell überwinden kann das gleiche wie die Aktionsparameter oder gibt einen expliziten Namen und den Wert in das Textfeld, ex:

@Html.TextBox("Tier2Notes",Model.Tier2Issue.Tier2Notes, new { @class = "form-control"}) 

Dies sollte es

0

Sie haben das Recht darauf. Es scheint oft ziemlich repetitiv zu sein, ein Viewmodel, ein DTO und eine Entity zu haben, die alle die gleichen Eigenschaften haben, aber sie alle machen unterschiedliche Jobs und enden normalerweise ein wenig auseinander. Ein Dto könnte als Ansichtsmodell dienen, aber es ist ein quadratischer Pflock in einem runden Loch. Wenn Sie keinen automatischen Mapper verwenden, um diese Objekte einander zuzuordnen (dies kann eine Meinung sein, aber es ist weit verbreitet) - dann verwenden Sie Auto-Mapper, um sinnlose Tastenanschläge zu speichern.

Verwandte Themen