In der ASP.Net MVC 5-Anwendung, die ich derzeit schreibe, kann eine Material
viele Namen haben (MaterialName
s). Ich habe eine Webschnittstelle zum Hinzufügen, Bearbeiten und Löschen dieser Namen für das Material auf den Seiten Edit
und Create
des Materials erstellt. Um dies zu erreichen, habe ich mehrere text
- input
s auf den Seiten, die Material.MaterialNames
genannt werden. Diese können clientseitig mit Javascript hinzugefügt und gelöscht werden, um die Anzahl der Namen zu ändern. Ich brauche keine Indizes in den name
s der input
s, weil die Daten, die der Benutzer sehen und bearbeiten sollte, nur eine flache Liste von Strings ist. MVC5 Benutzerdefinierte Bindung: Liste der Zeichenfolgen zu Liste der komplexen Art
Dies sind die relevanten Teile meiner Modelle:
public class MaterialVM
{
public Material Material { get; set; }
// ...
}
public class Material
{
public int Id { get; set; }
public List<MaterialName> MaterialNames { get; set; }
// ...
}
public class MaterialName
{
public int Id { get; set; }
public string Name { get; set; }
public int MaterialId { get; set; }
}
Nun sind alle großen funktionieren würde, wenn Material.MaterialNames
List<string>
vom Typ wäre. In meinem Fall kann der Modellbinder MaterialName
s nicht aus den mehreren Zeichenkettenwerten erstellen, die als Formulardaten übergeben wurden. Ich glaube, dass der Standard-Ansatz, dies zu beheben wäre
ein Bindemittel benutzerdefiniertes Modells Schreiben
Ist es eine gute Idee, dass wie in this answer zu tun (= BindProperty
außer Kraft setzen und nur das Verhalten für eine PropertyType ändern)? Ich würde das mit globally registering the binder für den Typ MaterialVM
kombinieren.
Vermisse ich eine einfachere Option?
Ist es nicht möglich, dem Standardbinder einfach eine Methode zum Umwandeln/Konvertieren/Serialisieren/... eines einfachen Typs in einen komplexen Typ anzubieten? Ist meine Vorgehensweise zum Schreiben eines benutzerdefinierten Modellbinders korrekt? Gibt es noch andere Möglichkeiten, die ich noch intuitiver machen könnte?
die Antworten finden Sie [hier] (http://stackoverflow.com/questions/29161481/post-a-form-array-without-successful/29161796#29161796) und [hier] (http://stackoverflow.com/questions/28019793/submit-same-partial -view-called-multiple-mal-data-to-controller/28081308 # 28081308) zum dynamischen Hinzufügen und Löschen komplexer Objekte fr om Sammlungen –
Ich weiß über die Möglichkeit der Verwendung von Indizes. Ich suchte nach einer Lösung ohne sie, weil ich denke, dass sie viel HTML-Overhead produzieren, ohne dass das nötig wäre, da ich nur eine Zeichenkette pro Index habe. –
Da Sie eine Sammlung von komplexen Objekten bearbeiten, müssen Sie Indexer verwenden (es gibt keine Möglichkeit, herauszufinden, welcher 'Name' zu welcher 'Id'- und' MaterialId'-Eigenschaft gehört, besonders wenn Sie Elemente dynamisch hinzufügen und löschen, selbst wenn Sie sollten einen benutzerdefinierten ModelBinder erstellen). Sie können die Indexer nur vermeiden, wenn Ihre Eigenschaft 'öffentliche Liste ist. MaterialNames {get; einstellen; } –