ValueProvider不包含TryGetValue的定义

Mik*_*lls 9 c# asp.net-mvc datetime modelbinders

在我的应用程序中,我试图从DateTime字段拆分日期和时间,以便我可以在日期上放置一个jQuery日期选择器.我找到了Hanselman用于拆分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\MyProject\Project\Helpers\DateAndTimeModelBinder.cs 83 42项目

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

Nat*_*lor 14

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

TryGetValue()不是扩展方法,而是类型IDictionary上的方法<T,U>.bindingContext.ValueProvider自MVC1以来,类型已经改变为@mootinator指示.您可以忽略调用TryGetValue()而改为调用GetValue()并检查结果为null.我不确定它是否会抛出异常,因为我没有测试它,所以先尝试一下.

  • 确认如果在绑定上下文中找不到键,则新的GetValue()方法将返回null,因此不需要try/catch. (4认同)

Kev*_*ker 6

前几天我试图跟随汉塞尔曼的例子我遇到了这个问题.这不是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;
        }
    }
Run Code Online (Sandbox Code Playgroud)