我是新的使用自定义的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");
我将非常感谢您能给予我的任何指导.
解决方法
这个问题似乎是你试图将类型为DynamicDataItem的对象绑定到一个输入.由于DynamicDataItem不是字符串或其他一些基本类型,所以没有一个简单的方式来解析您的输入,并返回null.
假设类DynamicDataItem具有自己的属性,你想要做的是为DynamicDataItem的每个属性提供编辑器.如果您想要做的只是从视图传递一个绑定的子对象集合的模型,则甚至不需要自定义模型绑定.我想你想要的是你看来更像这样的东西
<input type="text" name="DynamicDataItem[0].SomeTextField" /> <input type="text" name="DynamicDataItem[0].SomeOtherTextField" />
查看Phil Haack和Scott Hanselman的话题
我希望有所帮助