我有一个动作:
[HttpPost]
public ActionResult(Animal a)
{
}
我希望a
成为Rabbit
或Dog
,具体取决于传入的表单数据。有没有一种简单的方法来实现这一目标?
谢谢
答案 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;
}
}
对象,您会看到它的类型为a
或Rabbit
基于什么页面模型是。