ValueProvider не содержит определения для TryGetValue - PullRequest
9 голосов
/ 11 ноября 2010

В моем приложении я пытаюсь разделить поля Date и Time from и DateTime, чтобы можно было использовать средство выбора даты jQuery для даты. Я нашел код Хансельмана для разбиения DateTime , однако я получаю ошибку компиляции на bindingContext.ValueProvider.TryGetValue(modelName, out valueResult);. Я получаю ошибку:

Ошибка 3 «System.Web.Mvc.IValueProvider» не содержит определения «TryGetValue», и не найдено никакого метода расширения «TryGetValue», принимающего первый аргумент типа «System.Web.Mvc.IValueProvider» вам не хватает директивы using или ссылки на сборку?) C: \ Documents and Settings \ xxx \ Мои документы \ Visual Studio 2008 \ Projects \ MyProject \ Project \ Helpers \ DateAndTimeModelBinder.cs 83 42 Project

Что я что-то упустил? Я создал новый класс и поместил его код в папку Helpers в моем проекте.

Ответы [ 2 ]

14 голосов
/ 11 ноября 2010

TryGetValue() не является членом System.Web.Mvc.IValueProvider. Я подозреваю, что у него есть собственное расширение, которое выглядит примерно так:

public static bool TryGetValue(this IValueProvider valueProvider, string key, out ValueProviderResult result) {
    try {
        result = valueProvider.GetValue(key);
        return true;
    }
    catch {
        result = null;
        return false;
    }
}

Обновление

TryGetValue() не является методом расширения, а скорее методом типа IDictionary <T,U>. Тип bindingContext.ValueProvider изменился с MVC1, как указано @mootinator. Возможно, вы можете просто проигнорировать вызов TryGetValue() и вместо этого позвонить GetValue() и проверить результат на ноль. Я не уверен, что это вызовет исключение, так как я не проверял его, поэтому попробуйте сначала.

6 голосов
/ 11 ноября 2010

У меня была эта проблема, когда я пытался последовать примеру Гансельмана на днях. Это не пример MVC2. TryGetValue не работает и / или больше не нужен. Попробуйте эту ссылку:

http://forums.asp.net/p/1529895/3706154.aspx

Я создал метод расширения MVC2 из метода GetA Хансельмана для замены, хотя я не уверен, работает ли он так, как задумано, поскольку он не решил мою уникальную проблему, которая на самом деле не имела ничего общего с датой или время.

public static T? GetA<T>(this ModelBindingContext bindingContext, string key) where T : struct
        {
            T? valueResult = null;
            if (String.IsNullOrEmpty(key)) return null;
            //Try it with the prefix...
            try
            {
                valueResult = (T?)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + key).ConvertTo(typeof (T));
            } catch (NullReferenceException){}
            //Didn't work? Try without the prefix if needed...
            if (valueResult == null && bindingContext.FallbackToEmptyPrefix == true)
            {
                try
                {
                    valueResult = (T?) bindingContext.ValueProvider.GetValue(key).ConvertTo(typeof (T));
                } catch (NullReferenceException){}
            }
            return valueResult;
        }
    }
...