C# 无法从用法推断类型参数。尝试显式指定类型参数
有人能帮我澄清一下吗。在我的ASP.NET MVC 2应用程序中,我有一个C# 无法从用法推断类型参数。尝试显式指定类型参数,c#,linq,generics,asp.net-mvc-2,expression,C#,Linq,Generics,Asp.net Mvc 2,Expression,有人能帮我澄清一下吗。在我的ASP.NET MVC 2应用程序中,我有一个BaseViewModel类,其中包括以下方法: public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> (Expression<Func<TModel, TProperty>> propertyExpression) {
BaseViewModel
类,其中包括以下方法:
public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
(Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
公共虚拟IDictionary GetHtmlatAttribute
(表达式属性Expression)
{
返回新字典();
}
其思想是,每个子viewmodel都可以覆盖此方法,并根据某些逻辑提供一组适当的html属性,以便在视图中呈现:
<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
(model => model.MyProperty)) %>
model.MyProperty,model.GetHtmlAttributes
(model=>model.MyProperty))%>
但是,当在上面一行中使用时,当我点击视图时,会出现编译错误:
<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
(model => model.MyProperty)) %>
方法“
…BaseViewModel.GetHtmlAttributes Expression”的类型参数指的是类型而不是实例。在第二个和第四个代码示例中,将示例中的“Model”改为小写
Model.GetHtmlAttributes
应该是
model.GetHtmlAttributes
C#编译器只有lambda
arg => arg.MyProperty
对于arg的推断类型(TModel),使用arg.MyProperty(TProperty)类型。这是不可能的。在您的示例中,编译器无法知道TModel应该是什么类型。您可以做一些接近您可能正试图用扩展方法做的事情
static class ModelExtensions
{
public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
(this TModel model, Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
}
我有同样的问题,我的解决方案:
在web.config文件中:
我知道这个问题已经有了公认的答案,但对于我这个.NET初学者来说,有一个简单的解决方案来解决我做错了什么,我想我会与大家分享
我一直在这样做:
@Html.HiddenFor(Model.Foo.Bar.ID)
对我起作用的是:
@Html.HiddenFor(m => m.Foo.Bar.ID)
(其中“m”是表示模型对象的任意字符串)如果有帮助,我在将null
传递到泛型TValue
的参数时遇到了这个问题,要解决这个问题,您必须转换null值:
(string)null
(int)null
等等。此错误也与缓存问题有关
我也遇到了同样的问题,它被解决了,只是清理和再次构建解决方案。我实际上在搜索一个类似的错误,谷歌把我送到这里来问这个问题。
错误是:
方法的类型参数
'IModeExpressionProvider.CreateModelExpression(ViewDataDictionary,Expression>)'
无法从用法中推断
我大概花了15分钟想弄明白。它发生在Razor.cshtml视图文件中。
我必须对视图代码的某些部分进行注释,才能找到它的作用所在,因为编译器帮不上什么忙
<div class="form-group col-2">
<label asp-for="Organization.Zip"></label>
<input asp-for="Organization.Zip" class="form-control">
<span asp-validation-for="Zip" class="color-type-alert"></span>
</div>
你能认出它吗?是 啊我可能重新检查了两次,一开始没拿到
查看ViewModel的属性是Zip
,而它应该是Organization.Zip
。就这样
因此,请重新检查您的视图源代码…:-) 神圣的蝙蝠侠!是的,完全正确。在我们30英寸的显示器上,在这些小窗口中来回滚动代码只得到6.5英寸,这是荒谬的。来吧,SA伙计们,拿上你们的VC钱,开始动态调整页面大小吧!谢谢你的建议,但我需要给它一个模型对象的特定实例(公开视图的模型属性)。'model'实际上不存在于TextBoxFor helper的htmlAttributes参数的上下文中。非常感谢Jim!你救了我一天,我在谷歌上搜索了好几天,没有找到主要问题的解决方案,但在这里的一个小评论中找到了你的问题!我正在使用MVC4.0附带的VS 2012,是的,添加了targetFramework=“4.0”解决了ViewBag、Html.TextboxFor等下的红线问题。我打开了一个新的,使用了您的答案,并获得了信任。希望它能帮助别人。谢谢吉姆,你救了我一天。你能解释一下为什么这个targetFramework很重要吗?您是如何发现的?对我来说,这也是一个缓存问题,但只有在重新启动Visual Studio后才得到解决。对我来说,这是在更新被引用模型的名称空间之后发生的。我遇到了这个问题,它也在为我缓存!在这种情况下,这很好,但对于某些HtmlHelper扩展来说是不可接受的。实际上,我创建了以下扩展:publicstatic IHtmlContent EnumCheckBoxListFor(此IHtmlHelper-htmlHelper,Expression-Expression,object-htmlAttributes=null)
。在这种情况下,我无法使用虚拟/覆盖解决方案(而且我看不到任何“干净”的解决方案)。请注意,当我在视图中调用它时,模型类型可以推断,而枚举类型不能。谢谢。我也有同样的问题,这个答案对我帮助很大。似乎在“asp for”或“asp validation for”上使用不存在的属性名会导致该异常。
<div class="form-group col-2">
<label asp-for="Organization.Zip"></label>
<input asp-for="Organization.Zip" class="form-control">
<span asp-validation-for="Zip" class="color-type-alert"></span>
</div>