Basisklasse: AbstractBuildBlock, Abgeleitet: TextBlock, ImageBlock, EmptyBlock, ....Modellbindung und Vererbung ASP MVC 5
hier Blocks: Site -> Seiten [someIndex] -> Zeilen [someIndex] -> BuildBlocks
Felder BuildBlocks ist vom Typ AbstractBuildBlock, also wenn ich Site DB bin Speichern in BuildBlocks jeder Datensatz hat descriminator AbstractBuildBlock . Ich versuche, die nächsten in BuildBlockRepository zu tun:
switch(obj.ContentType)
{
case "text":
obj = obj as TextBlock;
context.BuildBlocks.Add(obj);
break;
}
Nach obj = obj as TextBlock
obj
null
ist. Der Grund dafür ist, dass obj vom Typ AbstractBuildBlock ist. Ich fand bei msdn, dass dieser Code funktionieren sollte:
BaseClass a = new DerivedClass()
DerivedClass b = a as DerivedClass
Also muss ich diesen Code bei Modell verbindlich reproduzieren. Dies ist Ajax-Anforderung:
$('.saveSite').click(function() {
$.ajax({
url: '/Site/Update',
data: { site: getSite() },
method: 'POST',
success: function (data) {
console.log('Success save');
},
error: function (data) {
debugBox(data);
}
});
});
und mvc Aktion für diese Anfrage
public string Update(Site site)
{
siteRepository.Add(site);
return "Success";
}
Also ich Site in json Form, BuildBlocks senden, die auch in dieser Seite in Form von json sind, aber natürlich ihre (Blöcke) ist kein AbstractBuildBlock, sie sind alle aus TextBlock, ImageBlock usw. und haben Felder mit Werten.
Das Problem: Site Feld BuildBlocks hat die Art AbstractBuildBlock und Binder Modell etwas tun, wie das ist:
buildBlock = new AbstractBuildBlock(); //loose derived classes fields and posibility to convert it in DerivedClass
buildBlocks.push(buildBlock)
aber ich brauche sowas wie diese
switch(buildBlock.contenType) {
case "text" : buildBlock = new TextBlock();buidlBlocks.push(buildBlock);
}
Werfen Sie einen Blick auf: http://stackoverflow.com/questions/7222533/polymorphic-model-binding, was ich denke, kann hilfreich sein. Übrigens, es ist klar, dass Sie wirklich hart daran gearbeitet haben, diese Frage zu formulieren - viele Leute, die nach SO fragen, bemühen sich nicht um ihre Fragen, aber Sie haben es getan. Allerdings denke ich, dass Sie in diesem Fall Ihre Frage etwas vereinfachen können, indem Sie sich auf "obj = obj als TextBlock" konzentrieren und warum es nicht funktioniert. Gibt uns den vollständigen Code dafür, aber konzentrieren Sie sich weniger auf die anderen Sachen (halten Sie gerade genug, damit wir eine Vorstellung davon haben, was Sie tun). – DWright
Sie können Json.NET für Ihr Modellbinder verwenden, wie in [Wie verwendet man Json.NET für JSON-Modellbindungen in einem MVC5-Projekt?] (Https://stackoverflow.com/questions/23995210), sie verwenden einen 'JsonConverter 'zu einem konkreten Typ auf Basis der im JSON vorhandenen Eigenschaften zu deserialisieren, wie in [Deserialisieren von polymorphen JSON-Klassen ohne Typinformation unter Verwendung von json.net] (https://stackoverflow.com/questions/19307752) gezeigt. – dbc