2009-05-19 11 views
0

Erste Beitrag Zeit,Meine Aktion Controller Code sieht dilettantisch

Ich habe um mit MVC abit spielen ... Ich habe eine Ansicht, die mehrere Eingabefelder hat, können einige dieser Felder auf Post leer sein.

Die Aktionsmethode in der Steuerung für den Posten sieht so etwas wie dieses Ich

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember) 

haben die DynamicQuery Erweiterung wurde verwendet, die um auf meine Datenbank auszuführen dynamische Linq querys um wurde Tritte und ich Dieses Objekt wird in ein Suchobjekt eingekapselt, das zur Ausführung an die Datenzugriffsebene übergeben wird.

Ich habe jedoch auch ein benutzerdefiniertes ViewData-Objekt, das an die Ansicht zurückgegeben wird, um die Eingabewerte und die Ergebnisse der Abfrage anzuzeigen.

Es sieht alles ein bisschen eklig im Code aus, da ich sowohl die Suchobjekteigenschaften als auch die ViewDatas einstellen muss.

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember) { 
var search = new Search { 
Id = id, 
FirstName = firstName, 
LastName = lastName, 
Member = isMember 
}; 

var memberViewData = new MemberViewData { 
Id = id, 
FirstName = firstName, 
LastName = lastName, 
Member = isMember 
}; 

memberViewData.Results = _dataRepository.GetMember(search); 

return View("Search", memberViewData); 

} 

denke ich das immer und sollte wirklich nur die Werte an die Datenzugriffsschicht passieren und das Viewdata in der Steuerung füllen, oder gibt es eine viel elegantere Muster oder betreibe ich verwenden könnte?

Tut mir leid, wenn das scheint Dump, nicht allot von Menschen, um Ideen aus und Zeit, um in den Rahmen zu graben.

Antwort

1

Entsprechend Ihrem Code enthält die MemberViewData-Klasse die Results-Eigenschaft zusätzlich zu den Eigenschaften der Search-Klasse. Der erste Schritt besteht also darin, MemberViewData von der Suche ableiten zu lassen und einen Konstruktor zu definieren, der die Suchinstanz als Parameter akzeptiert und ihm die grundlegenden Eigenschaften zuordnet. Als nächstes würde ich die Aktionsmethode wie folgt ändern:

public ActionResult Filter(Search search) 
{ 
    return View("Search", new MemberViewData(search) 
    { 
     Results = _dataRepository.GetMember(search) 
    }); 
} 
+0

interesting, aber wie ich es verstehe kann ich nur Eingabefelder von der Ansicht an die ActionMethod übergeben, wo ist die Suche instanziiert? –

+0

Gerade geschafft, etwas Zeit zu finden, damit zu spielen, und ich kann sehen, dass Mvc versuchen wird, die Formularfelder standardmäßig mit den Eigenschaften auf dem Objekt zu binden, ohne irgendeine zusätzliche Kodierung !! –

+0

Ja, das ist richtig. Es verwendet einen Standardmodellbinder, den Sie überschreiben können, wenn Sie eine feinere Kontrolle über die Parameterbindung benötigen. –

2

Verwendung Modelbinder binden Daten

0

Wie Tadeusz erwähnte, ein Modelbinder die MemberViewData für Sie bauen helfen kann, die nur die Ergebnisse geholt werden lassen würde.

Sie könnten auch entscheiden, einen Präsentationsdienst zu erstellen, der versteht, wie dieses Ansichtsdatenobjekt erstellt und einfach an es delegiert wird. Ich würde jedoch den Modellbinder Ansatz hier bevorzugen.

Verwandte Themen