MVC 3.0 ModelBinder bindingContext.ValueProvider.GetValue (ключ) возвращает ноль при связывании в коллекции - PullRequest
10 голосов
/ 07 февраля 2012

Я новичок в использовании пользовательских ModelBinder, я искал и не смог найти ни одного поста, связанного с этим конкретным случаем.

У меня есть такая сущность:

 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 (ключ), он возвращает значение true, но когда я получаю GetValue (ключ), он возвращаетноль.Если я проверю, что содержит ValueProvider, я вижу, что есть несколько элементов с их ключом, начинающимся в «DynamicDataItem [0]».Как я могу получить информацию из всех полей для элемента, который в настоящее время привязывается («DynamicDataItem [0]»)?Должен ли я получить их всех по одному?Вот так:

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

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

Ответы [ 3 ]

1 голос
/ 15 июня 2012

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

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

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

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

1 голос
/ 29 сентября 2017

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

ValueProviderResult result = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
if(result == null)
    result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + propertyDescriptor.Name);
1 голос
/ 18 мая 2012

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

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

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

Проверьте Фила Хаака и Скотта Хансельмана на тему

Здесь и Здесь

Надеюсь, это поможет

...