Ist es sinnvoll, ein Objekt zu erstellen, das nur die Eigenschaften enthält, die der Benutzer auf der Webseite eingibt, diese für die Bindung im Controller verwendet und dann dem vollständigen Entity-Objekt zuordnet? Oder sollten Sie einfach das Objekt entity verwenden und mit Include and Exclude einschränken, was bei der Eingabe gebunden wird?Verwendung von Include und Exclude in asp.net mvc-Bindung ODER Erstellen eines neuen Subset-Objekts?
Verwendung von Include und Exclude in asp.net mvc-Bindung ODER Erstellen eines neuen Subset-Objekts?
Antwort
Ich empfehle in den meisten Fällen die Verwendung eines separaten Präsentationsmodelltyps. Abgesehen von der Frage der Bindung (was wichtig ist, aber es gibt auch andere Möglichkeiten, um dieses Problem), denke ich, dass es andere Gründe, warum Typen Präsentationsmodell ist eine gute Idee:
- Präsentationsmodelle erlauben „view- erste "Entwicklung. Erstellen Sie gleichzeitig eine Ansicht und ein Präsentationsmodell. Lassen Sie sich von Ihrem Benutzervertreter Feedback zur Ansicht geben. Iterate, bis Sie beide glücklich sind. Schließlich, lösen Sie das Problem der Zuordnung zurück zum "echten" Modell.
- Präsentationsmodelle entfernen Abhängigkeiten, die das "echte" Modell haben könnte, was ein einfacheres Komponententesten von Controllern ermöglicht.
- Präsentationsmodelle haben dieselbe "Form" wie die Ansicht selbst. Sie müssen also in der Ansicht keinen Code schreiben, um sich mit "Detailobjekten" und ähnlichem zu beschäftigen.
- Einige Modelle können nicht in einem Aktionsergebnis verwendet werden. Zum Beispiel kann ein Objektdiagramm, das Zyklen enthält, nicht zu JSON serialisiert werden.
Ich bin gekommen, um die Idee zu mögen, Schnittstellen zu verwenden, um zu trennen, welche Eigenschaften enthalten sein sollten, wenn das Objekt aktualisiert wird.
Zum Beispiel:
zu erstellen und eine Person Objekt zu aktualisieren:
interface ICreatePerson
{
string Name { get; set; }
string Sex { get; set; }
int Age { get; set; }
}
interface IUpdatePerson
{
string Name { get; set; }
}
class Person : ICreatePerson, IUpdatePerson
{
public int Id { get; }
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
}
Dann, wenn Modells Bindung, nur die entsprechenden Schnittstelle als Typ verwenden und es wird nur die Namen Eigenschaft aktualisieren. Hier
ist ein Beispiel Controller-Methode:
public ActionResult Edit(int id, FormCollection collection)
{
// Get orig person from db
var person = this.personService.Get(id);
try
{
// Update person from web form
UpdateModel<IUpdatePerson>(person);
// Save person to db
this.personService.Update(person);
return RedirectToAction("Index");
}
catch
{
ModelState.AddModelErrors((person.GetRuleViolations());
return View(person);
}
}
Siehe this article (und Kommentare) für eine sehr gute Diskussion der Optionen.
so in der Action Methode Sie zuerst die gesamte ‚Person‘ in dem Methodenparameter, akzeptieren und dann mit Update filtern? – zsharp
Im Allgemeinen, nein. Die UpdateMethode verwendet die Formularwerte hinter den Kulissen. Angesichts des begrenzten Platzes in den Kommentaren habe ich die Antwort mit einer Beispielmethode aktualisiert. –
Sie können auch die Formcollection zu Updatemodel() übergeben, die ohne spöttische für Unit-Tests ermöglicht. –
- 1. Benennung von include/exclude enum
- 2. Erstellen eines neuen Puffers mit Text unter Verwendung von EmacsClient
- 3. Include/Exclude-Dateien pro Visual Studio-Konfiguration
- 4. Erstellen eines neuen NSCalendar-Kalenders
- 5. angularjs/rendering Leistungsunterschied zwischen Inlining oder Verwendung von ng-include
- 6. Erstellen eines neuen Produkts: ASP.NET im Vergleich zu SharePoint 2010
- 7. Hinzufügen eines Schemas oder Erstellen einer neuen Instanz?
- 8. Erstellen eines neuen Location-Objekts in JavaScript
- 9. Erstellen eines neuen Menüelements - Wordpress
- 10. Java - Erstellen eines neuen Threads
- 11. In Javascript - Erstellen eines neuen Objekts
- 12. Erstellen eines neuen TCP-Sockets - Serverseite
- 13. Entity Framework .Include Erstellen eines falschen JOIN?
- 14. Exclude abi von apk
- 15. Verwendung von @include vs @extend in Sass?
- 16. Erstellen eines neuen Datensatzes in Join Tabelle
- 17. Erstellen eines Spiels ohne Verwendung von SpriteKit
- 18. Erstellen eines "Heartbeat" oder Windows-Service-Like-Funktionalität in Asp.Net
- 19. Erstellen eines neuen Mitglieds programmgesteuert in Umbraco
- 20. Erstellen eines neuen Objekts und vorbei in Methodenparameter
- 21. Mehrere Grep-Rohrleitungen (include + exclude) führt dazu, dass nichts angezeigt
- 22. Erstellen eines neuen WordPress-Benutzers mit Webservice
- 23. Erstellen und Festlegen eines Linkelements in einer neuen HTML-Seite in einem neuen Fenster
- 24. Erstellen eines neuen Vektors mit einer Transformation
- 25. Fehler beim Erstellen eines neuen Entitätsdatenmodells
- 26. Installieren eines neuen Standortanbieters
- 27. Eclipse friert beim Erstellen eines neuen Projekts oder einer neuen Klasse ein
- 28. Erstellen eines neuen TinyMCE-Formular-Widget
- 29. Hinzufügen eines neuen Grant-Typs in ASP.NET Identity?
- 30. exclude Subview von UITapGestureRecognizer
Eigentlich möchte ich das tun, aber wo definiere ich diese Klassen? Wie genau zu implementieren? bindet der Modellbinder diese Klassen? – zsharp
Ich habe sie in den Ordner Modelle der MVC-Anwendung. Das "echte" Modell (mein Entity Framework-Modell) wird in einer separaten Assembly erstellt. Ja, das Modellbinder kann an diese Typen binden. Manchmal ist das Modell der Benutzer-POSTs dasselbe wie das Präsentationsmodell, manchmal nicht. –