代码之家  ›  专栏  ›  技术社区  ›  Mike Wills

ValueProvider不包含TryGetValue的定义

  •  9
  • Mike Wills  · 技术社区  · 14 年前

    在我的应用程序中,我正试图分割Date和Time from和DateTime字段,以便在日期上放置jQuery日期选择器。我发现 Hanselman's code for splitting the DateTime ,但是我在 bindingContext.ValueProvider.TryGetValue(modelName, out valueResult); . 我得到的错误是:

    错误3“System.Web.Mvc.IValueProvider”不包含“TryGetValue”的定义,并且找不到接受“System.Web.Mvc.IValueProvider”类型的第一个参数的扩展方法“TryGetValue”(是否缺少using指令或程序集引用?)C: \Documents and Settings\xxx\My Documents\Visual Studio 2008\Projects\My Project\Helpers\DateAndTimeModelBinder.cs 83 42项目

    我遗漏了什么?我创建了一个新类,并将他的代码放在项目的Helpers文件夹中。

    2 回复  |  直到 14 年前
        1
  •  14
  •   Nathan Taylor    13 年前

    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() 并检查结果是否为空。我不确定它是否会抛出异常,因为我还没有测试过它,所以先试试。

        2
  •  6
  •   Kevin Stricker    14 年前

    前几天我很难效仿汉斯曼的榜样。这不是MVC2的例子。TryGetValue不起作用和/或不再需要。尝试此链接:

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

    我从Hanselman的GetA方法中创建了一个MVC2扩展方法来替换它,但我不确定它是否按预期工作,因为它没有解决我的独特问题,而这个问题实际上与日期或时间无关。

    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;
            }
        }