【发布时间】:2016-12-20 11:11:15
【问题描述】:
基类:AbstractBuildBlock,派生:TextBlock,ImageBlock,EmptyBlock,...。
此处的块:站点 -> 页面[someIndex] -> 行[someIndex] -> 构建块
Fields BuildBlocks 属于 AbstractBuildBlock 类型,因此当我在 BuildBlocks 中将站点保存到 DB 时,每条记录都有标识符 AbstractBuildBlock。我尝试在 BuildBlockRepository 中执行下一个操作:
switch(obj.ContentType)
{
case "text":
obj = obj as TextBlock;
context.BuildBlocks.Add(obj);
break;
}
在obj = obj as TextBlock obj 之后是null。原因是 obj 是 AbstractBuildBlock 类型。我在 msdn 发现这段代码应该可以工作:
BaseClass a = new DerivedClass()
DerivedClass b = a as DerivedClass
所以我需要在模型绑定时重现此代码。这是 ajax 请求:
$('.saveSite').click(function () {
$.ajax({
url: '/Site/Update',
data: { site: getSite() },
method: 'POST',
success: function (data) {
console.log('Success save');
},
error: function (data) {
debugBox(data);
}
});
});
这个请求的 mvc 动作
public string Update(Site site)
{
siteRepository.Add(site);
return "Success";
}
所以我以 json 形式发送站点,该站点中的 BuildBlocks 也以 json 形式发送,但是它们的(块)类型当然不是 AbstractBuildBlock,它们都是 TextBlock、ImageBlock 等,并且具有带值的字段.
问题:站点具有类型为 AbstractBuildBlock 的字段 BuildBlocks,模型绑定器执行以下操作:
buildBlock = new AbstractBuildBlock(); //loose derived classes fields and posibility to convert it in DerivedClass
buildBlocks.push(buildBlock)
但我需要这样的东西
switch(buildBlock.contenType) {
case "text" : buildBlock = new TextBlock();buidlBlocks.push(buildBlock);
}
【问题讨论】:
-
看看:stackoverflow.com/questions/7222533/polymorphic-model-binding,我认为这可能会有所帮助。顺便说一句,很明显,你在写这个问题上付出了很大的努力——很多人在 SO 上提问并没有把精力放在他们的问题上,但你有。但是,我认为在这种情况下,您也许可以通过关注
obj = obj as TextBlock;以及为什么它不起作用来简化您的问题。为我们提供了完整的代码,但较少关注其他内容(保持足够,以便我们了解您在做什么)。 -
您可以使用 Json.NET 作为模型绑定器,如 How to use Json.NET for JSON modelbinding in an MVC5 project? 所示,它们使用
JsonConverter根据 JSON 中存在的属性反序列化为具体类型,如图所示Deserializing polymorphic json classes without type information using json.net.
标签: c# asp.net json asp.net-mvc inheritance