List <basetype>模型绑定与类型描述符</basetype>

时间:2011-09-08 16:27:04

标签: asp.net-mvc asp.net-mvc-3 model-binding

给出以下派生类型:

public class Base {
    public string Id {get;set;}
}

public class Contact : Base {
    public string FirstName {get;set;}
    public string LastName {get;set;
}

public class Organization : Base {
    public string Name {get;set;}
}

我想使用自定义模型绑定器绑定类似的内容:

[HttpPost]
public ActionResult UpdateMultiple(List<Base> items) {
    for each (var item in items) {
        if (item.GetType().Equals(typeof(Contact)) {
             // update
        } else if (item.GetType().Equals(typeof(Organization)) {
             // update
        }
    }
    return RedirectToAction("index");
}

我的计划是每个项目都有一个自定义类型描述符:

<input type="hidden" name="items[0].EntityType" value="MyNamespace.Contact, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<input type="text" name="items[0].FirstName" />
<input type="text" name="items[0].LastName" />

<input type="hidden" name="items[1].EntityType" value="MyNamespace.Organization, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<input type="text" name="items[1].Name" />

我为单个(非集合)对象开发了一个自定义模型绑定器:

 public class EntityTypeModelBinder : DefaultModelBinder
    {
        protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
        {
            var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".EntityType");
            var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)),true);
            var model = Activator.CreateInstance(type);
            bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
            return model;
        }
    }

但有没有人对如何将此模型绑定器转换为处理集合有任何建议?我很茫然。

致以最诚挚的问候和感谢。

哈尔

1 个答案:

答案 0 :(得分:1)

您显示的此模型绑定器已处理集合。您只需在Application_Start

中添加以下内容即可
ModelBinders.Binders.Add(typeof(Base), new EntityTypeModelBinder());

它足够智能,它也适用于集合,因为List<Base>没有注册的模型绑定器,它将是将被调用的默认模型绑定器。它检测到您有一个集合,并为集合的每个元素调用相应的模型绑定器。并且因为您已为Base类型注册了模型绑定器,所以将自动使用自定义绑定器。