gpt4 book ai didi

c# - MVC 自定义模型 Binder 使用特定表单值的默认 Binder

转载 作者:行者123 更新时间:2023-11-30 14:35:50 27 4
gpt4 key购买 nike

我有一个自定义模型绑定(bind)器,它会为进入操作方法的特定参数调用:

public override ActionResult MyAction(int someData, [ModelBinder(typeof(MyCustomModelBinder))]List<MyObject> myList ... )

这很好用 - Binder 按预期调用。但是,我想为 Request.Form 集合中的一些 addtional 值调用默认模型联编程序。表单键被命名为像这样:

dataFromView[0].Key
dataFromView[0].Value
dataFromView[1].Key
dataFromView[1].Value

如果我在操作方法上添加 IDictionary 作为参数,默认模型绑定(bind)器会很好地将这些值转换为 IDictionary。

但是,我想在模型联编程序级别(连同上面的原始 List 对象)操作这些值。

有没有办法让默认模型绑定(bind)器根据我的自定义模型绑定(bind)器的 BindModel() 方法中的表单值创建此字典?

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
//Get the default model binder to provide the IDictionary from the form values...
}

我尝试使用 bindingContext.ValueProvider.GetValue,但当我尝试转换为 IDictionary 时它似乎总是返回 null。

最佳答案

这是我找到的一个潜在解决方案(通过查看默认模型 Binder 源代码),它允许您使用默认模型 Binder 功能来创建字典、列表等。

创建一个新的 ModelBindingContext 详细说明您需要的绑定(bind)值:

var dictionaryBindingContext = new ModelBindingContext()
{
ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(IDictionary<long, int>)),
ModelName = "dataFromView", //The name(s) of the form elements you want going into the dictionary
ModelState = bindingContext.ModelState,
PropertyFilter = bindingContext.PropertyFilter,
ValueProvider = bindingContext.ValueProvider
};

var boundValues = base.BindModel(controllerContext, dictionaryBindingContext);

现在使用您指定的绑定(bind)上下文调用默认模型绑定(bind)器,并将正常返回绑定(bind)对象。

到目前为止似乎工作...

关于c# - MVC 自定义模型 Binder 使用特定表单值的默认 Binder ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11409451/

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