Создавать ModelBinder для KeyValuePair <TKey, TValue>

Назначенный по умолчанию ModelBinder ASP.NET MVC не способен соединять данные с переменными типа KeyValuePair. Это он происходит от формы, которая у него есть, соединения сложных типов: во-первых создай новую инстанцию объекта через строителя без аргументов и далее установи стоимость различных свойств. В этом случае свойства Key и Value объекта KeyValuePair - только чтения, а следовательно он может распределять ему стоимость и остается пустой объект.

Решение произошло бы из-за того, что создало бы ModelBinder, настроенный для этого типа, но: как он мог бы создавать ModelBinder для характерного типа как KeyValuePair?

3
задан 12.05.2016, 17:33
3 ответа

В конце концов я это решил asГ-:

я создал ModelBinder для типов данных KeyValuePair< TKey, TValue> что получает стоимость свойств Key и Value и возвращает объект KeyValuePair:

public class KeyValuePairModelBinder : IModelBinder
{

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var values = bindingContext.ValueProvider as ValueProviderCollection;
        if (values == null)
        {
            return null;
        }

        var key = values.GetValue(bindingContext.ModelName + ".Key");
        var keyValue = Convert.ChangeType(key.AttemptedValue, bindingContext.ModelType.GetGenericArguments()[0]);
        var value = values.GetValue(bindingContext.ModelName + ".Value");
        var valueValue = Convert.ChangeType(value.AttemptedValue, bindingContext.ModelType.GetGenericArguments()[1]);
        return Activator.CreateInstance(bindingContext.ModelType, keyValue, valueValue);
    }
}

И ModelBinderProvider, который подтверждает, если тип данных модели соответствует с KeyValuePair< TKey, TValue> и, если он asГ, - возврати инстанцию этого ModelBinder:

public class KeyValuePairModelBinderProvider : IModelBinderProvider
{

    public IModelBinder GetBinder(Type modelType)
    {
        if (modelType.IsGenericType &&
            modelType.GetGenericTypeDefinition() == typeof (KeyValuePair<,>))
        {
            return new KeyValuePairModelBinder();
        }

        return null;
    }
}

Потом просто есть, что aГ±adir ModelBinderProvider в нее colecciГіn BinderProviders в mГ©todo Application_Start Global.asax:

ModelBinderProviders.BinderProviders.Add(new KeyValuePairModelBinderProvider());
0
ответ дан 24.11.2019, 14:25

Ища на теме смоги анализировать этот вопрос, сходный с тем, что ты выдвигаешь

ASP MVC.NET - how to bind KeyValuePair?

там верьте в один custom ModelBinder, где он обнаруживает тип информации model, и если его один KeyValuePair, выбери коллекции стоимости, которая происходит от request, и ты это распределяешь в инстанцию используя Activator.CreateInstance

Проанализируй пример выдвинутый Petr J

>> querГ, - чтобы смотреть ее opciГіn создания ModelBinderProvider, который отличал бы quГ© ModelBinder использовать для типов KeyValuePair

, может быть, ты мог бы оценивать

aspnetwebstack Binders

там края два класса: KeyValuePairModelBinder.cs и KeyValuePairModelBinderProvider.cs

я думаю, что ты указываешь во что-то как это на

2
ответ дан 24.11.2019, 14:25
  • 1
    S и # 237; он думал о чем-то сходном. Что мне не нравился слишком много этого soluci и # 243; n дело в том, что haci и # 233; ndolo схвати и # 237; быть должным и # 237; чтобы заменять назначенный по умолчанию ModelBinder aplicaci и # 243; n. Перед тем, как бросать из-за ах и # 237; quer и # 237; чтобы смотреть opci и # 243; n создания ModelBinderProvider, который отличал бы qu и # 233; ModelBinder использовать для типов KeyValuePair. – Asier Villanueva 12.05.2016, 17:32
  • 2
    Относительно c и # 243; говорит ModelBinder и ModelBinderProvider s и # 237; это идея. Действительно этим является implementaci и # 243; n WebAPI tambi и # 233; n существует другой implementaci и # 243; n для WebForms в namespace System. Веб. ModelBinding, но нет одной для MVC. – Asier Villanueva 12.05.2016, 18:23
  • 3
    потому что ты говоришь, что это осуществление для webapi? там я вижу, что эти классы находятся на System. Веб. Http я не вижу, что они применились только к ApiController, это мне кажется более общим – Leandro Tuttini 12.05.2016, 18:29
  • 4
    Потому что это implementaci и # 243; n, который использует WebAPI, что s и # 237; реализуй binding этого типа назначенных по умолчанию данных. implementaci и # 243; n от MVC он отличается. Например различные интерфейсы IModelBinder определяют тот же м и # 233; весь BindModel, но с различными подписями: - WebAPI: bool BindModel (HttpActionContext actionContext, ModelBindingContext bindingContext) - WebForms: bool BindModel (ModelBindingExecutionContext modelBindingExecutionContext, ModelBindingContext bindingContext) - MVC: Object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) – Asier Villanueva 12.05.2016, 18:38

В MVC5 существуй Кеивалуепаирмодельбиндерпровидер Класс

типов Привета

-1
ответ дан 24.11.2019, 14:25
  • 1
    Серхио, не функционирует соединение – Asier Villanueva 13.05.2016, 13:33
  • 2
    Прости, исправленный – Sergio Parra Guerra 13.05.2016, 13:44
  • 3
    S и # 237; в namespace Microsoft. Веб. Mvc. ModelBinding. Проблема состоит в том, что этот namespace определяет классы, чтобы реализовывать binding с контролем WebForm. В самом деле то, что возвращает м и # 233; весь GetBinder - IExtensibleModelBinder не объект IModelBinder как в MVC – Asier Villanueva 13.05.2016, 13:50