在我的应用程序中,我试图将日期和时间与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 \ MyProject \ Project \ Helpers \ DateAndTimeModelBinder.cs 83 42项目
我错过了什么?我创建了一个新类,并将他的代码放在我项目的Helpers文件夹中。
答案 0 :(得分: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;
}
}
<强>更新强>
TryGetValue()
不是扩展方法,而是类型IDictionary <T,U>
上的方法。自MVC1以来bindingContext.ValueProvider
的类型已更改为@mootinator指示。您可以忽略对TryGetValue()
的调用,而是调用GetValue()
并检查结果为null。我不确定它是否会抛出异常,因为我没有测试它,所以先尝试一下。
答案 1 :(得分: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;
}
}