11

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

我有一个像这样的实体:

 public class DynamicData
    {
       public IList<DynamicDataItem> DynamicDataItems{get;set;}
    }

在视图中,我将其绑定如下:

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

我在 DynamicDataItems 类中有特殊信息,我想以特定方式检索这些信息,因此我创建了自己的模型绑定器。

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]”开头。我如何从当前正在绑定的项目(“DynamicDataItem[0]”)的所有字段中检索信息?我应该一一检索它们吗?像这样:

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

我将不胜感激您能给我的任何指导。

4

3 回答 3

3

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

ValueProviderResult result = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
if(result == null)
    result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + propertyDescriptor.Name);
于 2017-09-29T10:15:42.030 回答
1

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

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

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

查看有关该主题的 Phil Haack 和 Scott Hanselman

这里这里

我希望这会有所帮助

于 2012-05-18T05:06:10.853 回答
1

我和你有同样的问题,当我挖掘时,我找到了你的页面,我认为这也可以帮助你:):

在查看此链接后给了我一个想法:基本上是在尝试解析查询字符串。您可以在 controllercontext.httpcontext 中找到它。

希望这对你有帮助

此致

于 2012-06-15T14:05:17.497 回答