我是新手使用自定义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");
我将非常感谢你能给我的任何指导。
答案 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的主题
我希望有帮助
答案 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);