gpt4 book ai didi

c# - 如何在 Asp.Net MVC 4 的多态模型中绑定(bind)复杂属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:09 25 4
gpt4 key购买 nike

我需要创建一个基于派生类型的动态输入表单,但当传递到我的 Controller 的 POST 方法时,我无法正确绑定(bind)复杂的属性。其他属性绑定(bind)良好。这是我所拥有的一个人为的例子:

型号

public abstract class ModelBase {}

public class ModelDerivedA : ModelBase
{
public string SomeProperty { get; set; }
public SomeType MySomeType{ get; set; }

public ModelDerivedA()
{
MySomeType = new SomeType();
}
}

public class SomeType
{
public string SomeTypeStringA { get; set; }
public string SomeTypeStringB { get; set; }
}

自定义模型绑定(bind)器

Binder 基于此答案:polymorphic-model-binding

public class BaseViewModelBinder : 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(ModelBase).IsAssignableFrom(type))
{
throw new InvalidOperationException("The model does not inherit from mode base");
}
var model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
return model;
}
}

Controller

[HttpPost]
public ActionResult GetDynamicForm([ModelBinder(typeof(BaseViewModelBinder))] ModelBase model)
{
// model HAS values for SomeProperty
// model has NO values for MySomeType
}

查看摘录

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

JavaScript

表单使用 $.ajax 使用 data: $(this).serialize() 发布,如果我调试它会显示正确填充的表单数据。

除了 SomeType 的属性外,所有属性都被填充到模型中。我需要更改什么才能填充它们?

谢谢

最佳答案

没有填充值,因为您正在创建如下类型的新实例:

var model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
return model;

并返回相同的模型,这是不正确的。

做如下的事情。

ValueProviderResult valueResult;
bindingContext.ModelState.SetModelValue("ModelType", valueResult);
return valueResult;

这里有关于 modelBinder 的非常好的讨论。

http://odetocode.com/blogs/scott/archive/2009/05/05/iterating-on-an-asp-net-mvc-model-binder.aspx

关于c# - 如何在 Asp.Net MVC 4 的多态模型中绑定(bind)复杂属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579606/

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