MVC模型类型条件绑定

时间:2014-04-10 18:57:54

标签: .net asp.net-mvc

我有一个动作:

[HttpPost]
public ActionResult(Animal a)
{

}

我希望a成为RabbitDog,具体取决于传入的表单数据。有没有一种简单的方法来实现这一目标? 谢谢

1 个答案:

答案 0 :(得分:3)

为了让这一点发挥作用,您正在考虑设置您的操作以接受动态参数,ModelBinder将转换为适当的类型,Rabbit或{{1 }}:

Dog

由于Action不知道对象是什么,它需要一种知道将对象转换为什么的方法。你需要两件事来实现这一目标。首先,你必须嵌入你的View,EditorTemplate,无论你绑定的模型是什么:

[HttpPost]
public ActionResult([ModelBinder(typeof(AnimalBinder))] dynamic a)
{

}

其次,模型绑定器将根据您在上面指定的@Html.Hidden("ModelType", Model.GetType()) 字段创建相应类型的对象:

ModelType

完成所有操作后,如果您检查传递给Action的动态public class AnimalBinder : DefaultModelBinder { protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) { var typeValue = bindingContext.ValueProvider.GetValue("ModelType"); var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true); if (!typeof(Animal).IsAssignableFrom(type)) { throw new InvalidOperationException("Bad Type"); } var model = Activator.CreateInstance(type); bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type); return model; } } 对象,您会看到它的类型为aRabbit基于什么页面模型是。