Custom Model Binding MVC

此生再无相见时 提交于 2019-12-11 08:39:42

问题


I'm trying to pass a list of JSON objects to a controller method, and automatically have the correct types defined and populated in the controller.

JSON Posted to controller:

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

The Controller:

public ActionResult SaveCOntent(IList<Item> content)

So the impression i've got is that I need to use ModelBinding to convert the elements into the correct type. I've tried following another suggested post (http://stackoverflow.com/questions/6484972/viewmodel-with-listbaseclass-and-editor-templates), which works in a way.. I get a list of the correct 'types' but all the properties are set to defaults and not populated.

I've tried extending the DefaultModelBinder with the following:

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);
    }

Now this works fine for the first type (Link), but as soon as I try to do the same for Image I get an error stating

An item with the same key has already been added.


回答1:


Turned out it works fine and my issue was with the base class of this object having a property with the same name.



来源:https://stackoverflow.com/questions/11757322/custom-model-binding-mvc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!