gpt4 book ai didi

.net - MVC 模型类型条件绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 17:39:22 25 4
gpt4 key购买 nike

我有一个行动:

[HttpPost]
public ActionResult(Animal a)
{

}

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

最佳答案

为了使其正常工作,您正在考虑设置您的操作以接受动态参数,即 ModelBinder将转换为适当的类型,或者 RabbitDog :

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

}

由于操作不知道它正在获取的对象是什么,因此它需要一种方法来知道将该对象转换为什么。要实现这一目标,您需要做两件事。首先,您必须在 View、EditorTemplate 中嵌入您要绑定(bind)的模型:

@Html.Hidden("ModelType", Model.GetType())

其次,模型绑定(bind)器将根据ModelType创建适当类型的对象。您在上面指定的字段:

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传递到 Action 中的对象,您将看到它的类型为 RabbitDog基于页面模型。

关于.net - MVC 模型类型条件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com