MVC 3.0 ModelBinder bindingContext.ValueProvider.GetValue(key)在集合中绑定时返回null

时间:2012-02-07 16:06:43

标签: c# asp.net-mvc modelbinder

我是新手使用自定义ModelBinders,我一直在寻找,我找不到与此特定案例相关的任何帖子。

我有一个像:

这样的实体
 public class DynamicData
    {
       public IList<DynamicDataItem> DynamicDataItems{get;set;}
    }

在View i中绑定它如下:

@Html.EditorFor(model => model.DynamicDataItems);

我在DynamicDataItems类中有特殊信息,我想以特定方式检索,所以我创建了自己的Model Binder。

public class DynamicDataItemBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext,
            ModelBindingContext bindingContext)
        {
            var key = bindingContext.ModelName;
            var valueProviderResult = bindingContext.ValueProvider
                .GetValue(key);

            if (valueProviderResult == null ||
                string.IsNullOrEmpty(valueProviderResult
                    .AttemptedValue))
            {
                return null;
            }

            //Here retrieve my own Information

            return DynamicDataItem;
        }
    }

bindingContext.ModelName包含“DynamicDataItem [0]”。

如果我执行bindingContext.ValueProvider.ContainsPrefix(key),则返回true,但是当我执行GetValue(key)时,它返回null。 如果我检查ValueProvider包含的内容,我会看到在“DynamicDataItem [0]”中有几个项目的Key Starting。 我如何处理从当前绑定的项目的所有字段中检索信息(“DynamicDataItem [0]”)? 我应该逐一检索它们吗? 像这样:

 var result1= bindingContext.ValueProvider.GetValue("DynamicDataItem[0].Id");
 var result2= bindingContext.ValueProvider.GetValue("DynamicDataItem[0].Name");

我将非常感谢你能给我的任何指导。

3 个答案:

答案 0 :(得分:1)

问题似乎是您正在尝试将类型为DynamicDataItem的对象绑定到输入。由于DynamicDataItem不是字符串或其他原始类型,因此绑定器没有直接的方法来确定如何处理输入并返回null。

假设类DynamicDataItem具有自己的属性,您想要做的是为DynamicDataItem的每个属性提供编辑器。如果您要做的只是从视图传递具有绑定的子对象集合的模型,您甚至不需要自定义模型绑定器。我认为你想要的是你认为更像这样的东西

<input type="text" name="DynamicDataItem[0].SomeTextField" />
<input type="text" name="DynamicDataItem[0].SomeOtherTextField" />

查看Phil Haack和Scott Hanselman的主题

HereHere

我希望有帮助

答案 1 :(得分:1)

我和你一样same issue当我在挖掘时,我找到了你的页面,我认为这也可以帮助你:):

在审核this link后,我想到了这个想法:基本上是试图解析查询字符串。您可以在controllercontext.httpcontext中找到它。

希望这有助于你

祝你好运

答案 2 :(得分:1)

我知道这是旧帖子,但我有同样的问题,我的解决方案是使用bindingContext.ModelName:

ValueProviderResult result = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
if(result == null)
    result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + propertyDescriptor.Name);