【发布时间】:2016-12-27 23:49:36
【问题描述】:
我正在 .net 核心中构建一个动态表单创建器。一个“表单”将由许多不同的表单元素组成。所以表单模型看起来像这样:
public class FormModel {
public string FormName {get;set;}
public List<IElements> Elements{get;set;}
}
我有 TextBoxElement、TextAreaElement、CheckBoxElement 的类,它们都实现了 IElemets 接口。每个元素我都有EditorTemplates。呈现表单的代码效果很好。尽管由于接口的List 无法发布表单。
我一直在研究如何实现自定义模型绑定器,并在网上看到了一些示例,但我没有让任何人工作。
如果有人能告诉我如何为此示例实现自定义模型绑定器,我将不胜感激。
B 计划: 将表单作为 json 发布到 web api 并让 JSON.Net 隐藏它。我已经尝试过了,它奏效了。在 startup.cs 我添加了:
services.AddMvc().AddJsonOptions(opts => opts.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
它在必要时返回类型,例如。 Elements-list 中的对象,但不在 FormModel 上的对象。但我真的很想知道如何使用自定义模型绑定器来解决它。
【问题讨论】:
-
模型绑定器如何知道在发布时为列表元素实例化哪种类型?
-
不知道为什么有人投了反对票。我想你必须发布一些额外的信息,让你的自定义模型绑定器知道要实例化什么类型的类。
-
我认为 JSON.NET 可以通过序列化/反序列化类型名称来处理类型。如果您使用的是 JSON,那么也许您可以利用它。
-
我的想法是隐藏类型的字段。
-
JSON.Net 可以反序列化,如果你在类型中包含一个 $type 参数,如果你做一些简单的事情。 JsonConvert.DeserializeObject
(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });我不确定在发布到 Web api 时如何添加此设置。同样在这种情况下,我只希望在发布 json 时使用此设置,而不是在返回时,如果可能的话,现在任何人都可以吗?
标签: asp.net-mvc asp.net-core asp.net-core-1.0 custom-model-binder