ASP.NET Core中的动态类型模型绑定

时间:2018-04-23 13:55:46

标签: c# asp.net-core model-binding

我目前正在开发一种可用于多种类型内容的内容编辑器,开发人员可以在其中指定自己的模型。例如,模型可能如下所示:

public class ImageWithCopyWidgetModel : WidgetModel, IWidgetModel
{
    public string ImageUrl { get; set; }
    public string ImageAltText { get; set; }

    public string HeaderText { get; set; }

    public string BodyContent { get; set; }
}

在编辑器方面,我有一个看起来像的视图模型:

public class EditContentViewModel<TModel> where TModel : IWidgetModel
{
    public int Id { get; set; }
    public string Name { get; set; }

    public TModel WidgetModel { get; set; }
}

我对GET /表格显示端的绑定工作正常。我的问题是让模型绑定器接受POST上的数据?我尝试过以下操作,但每个都会null返回model.WidgetModel

// Option 1
EditContent(int pageId, int id, EditContentViewModel<dynamic> model)

// Option 2
EditContent(int pageId, int id, EditContentViewModel<object> model)

// Option 3
EditContent(int pageId, int id, EditContentViewModel<IWidgetModel> model)

注意,出于测试目的,我尝试将WidgetModel的类型明确地设置为具体类(上面提到的ImageWithCopyWidgetModel)并且这样做。

我真的试图避免在这里使用Request.Form,因为它将限制此实施的未来计划。

1 个答案:

答案 0 :(得分:-1)

你想要的东西是不可能的,至少是开箱即用的。在帖子上,所有的模型绑定器都有一堆键值对字符串。什么告诉它关于如何将这些值绑定到有用的东西的决定是动作参数。具体来说,当您绑定到ImageWithCopyWidgetModel时,它无法知道它应该实际创建EditContentViewModel的实例。

此外,模型绑定器旨在丢弃它不知道如何处理的值。这意味着遗憾的是,事实之后甚至无法强制转换为ImageWithCopyWidgetModel,因为EditCopyViewModel上没有的所有属性都会被丢弃。

您最好的选择是自定义模型绑定器,但是对于Stack Overflow的范围来说,它的实现过于宽泛。我建议你参考documentation