MVC 3.0 ModelBinder bindingContext.ValueProvider.GetValue(ключ) возвращает null при привязке в коллекции

Я новичок в пользовательских 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;
        }
    }

СвязываниеContext.ModelName содержит "DynamicDataItem [0]" .

Если я делаю bindingContext.ValueProvider.ContainsPrefix(ключ), он возвращает true, но когда я делаю GetValue (ключ), он возвращает null. Если я проверю, что содержит ValueProvider, я вижу, что есть несколько элементов с их ключом запуска в "DynamicDataItem [0]" . Как я могу подавить информацию из всех полей для предмета, который в настоящее время привязан ( "DynamicDataItem [0]" )? Должен ли я получить их все по одному? Вот так:

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

Я буду очень признателен за любые рекомендации, которые вы можете мне дать.

Ответ 1

Проблема заключается в том, что вы пытаетесь привязать объект типа DynamicDataItem к вводу. Поскольку DynamicDataItem не является строкой или каким-либо другим примитивным типом, нет простого способа для связующего, чтобы выяснить, что делать с вашим вводом, и возвращает null.

Предполагая, что класс DynamicDataItem имеет свои собственные свойства, вы должны предоставить редакторам для каждого свойства DynamicDataItem. Если все, что вы пытаетесь сделать, это передать модель с привязанной коллекцией дочерних объектов из представления, вам даже не понадобится настраиваемое связующее устройство. То, что я думаю, что вы хотите, - это то, что вам кажется более читаемым.

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

Отъезд Phil Haack и Scott Hanselman по теме

Здесь и Здесь

Я надеюсь, что это поможет

Ответ 2

У меня была та же проблема, когда вы и когда я рылся, я нашел вашу страницу, и я думаю, что это тоже может вам помочь:):

После просмотра этой ссылки дает мне идею: в основном пытается разобрать querystring. Вы можете найти его в файле contextcontext.httpcontext.

надеюсь, что это поможет вам

С наилучшими пожеланиями

Ответ 3

Я знаю, что это старый пост, но у меня такая же проблема, и моим решением было использовать bindingContext.ModelName:

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