自定义模型绑定MVC



我正试图将JSON对象列表传递给控制器方法,并在控制器中自动定义和填充正确的类型。

JSON发布到控制器:

{ Type : 'Image', ImageName : 'blah.jpg' },
{ Type : 'Text', Text: 'Hello', Font: 'Some Font' }.. 

控制器:

public ActionResult SaveCOntent(IList<Item> content)

因此,我得到的印象是,我需要使用ModelBinding将元素转换为正确的类型。我试着关注另一个建议的帖子(http://stackoverflow.com/questions/6484972/viewmodel-with-listbaseclass-and-editor-templates),在某种程度上起作用。。我得到了一个正确的"类型"列表,但所有属性都设置为默认值,并且没有填充。

我已经尝试用以下内容扩展DefaultModelBinder:

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var typeName = (string)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".ItemTypeName").ConvertTo(typeof(string));
        if (typeName == "LINK")
        {
            bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => new Link(), typeof(Link));
            base.BindModel(controllerContext, bindingContext);
        }
        else if (typeName == "IMAGE")
        {
            //bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => new Image(), typeof(Image));
            //base.BindModel(controllerContext, bindingContext);
            return null;
        }
        return base.BindModel(controllerContext, bindingContext);
    }

现在,这对第一种类型(链接)来说很好,但当我尝试对图像进行同样的操作时,我会收到一个错误,说明

已添加具有相同键的项目。

事实证明它工作得很好,我的问题是这个对象的基类有一个同名的属性。

最新更新