Vel*_*rev 36 c# linq generics expression asp.net-mvc-2
有人可以请我澄清一些事情.在我的ASP.NET MVC 2应用程序中,我有一个BaseViewModel包含以下方法的类:
public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
(Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是每个子视图模型都可以覆盖此方法,并根据某些逻辑提供一组合适的html属性,以便在视图中呈现:
<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
(model => model.MyProperty)) %>
Run Code Online (Sandbox Code Playgroud)
但是当在上面的行中使用时,当我点击视图时出现编译错误:
方法'
...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)' 的类型参数不能从用法中推断出来.尝试显式指定类型参数.
我必须做以下事情:
<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
<ChildModel, string>(model => model.MyProperty)) %>
Run Code Online (Sandbox Code Playgroud)
我只是在寻找一些关于它如何尝试推断类型的清晰度,在HtmlHelper/TextBoxFor扩展方法中这样做是没有问题的?
是因为HtmlHelper在视图中将自动ViewUserControl与页面顶部指定的类型相同,而我的代码可以用于继承的任何类型BaseViewModel?有可能以这样的方式编写它,它可以推断我的模型/属性类型?
ina*_*lus 17
我知道这个问题已经有了一个公认的答案,但对我来说,一个.NET初学者,有一个简单的解决方案,我做错了,我想我会分享.
我一直这样做:
@Html.HiddenFor(Model.Foo.Bar.ID)
Run Code Online (Sandbox Code Playgroud)
对我有用的是改变这个:
@Html.HiddenFor(m => m.Foo.Bar.ID)
Run Code Online (Sandbox Code Playgroud)
(其中"m"是表示模型对象的任意字符串)
svi*_*ick 14
在您的示例中,编译器无法知道应该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>();
}
}
Run Code Online (Sandbox Code Playgroud)
但virtual我认为你不可能有类似的东西.
编辑:
实际上,你可以virtual使用自引用泛型:
class ModelBase<TModel>
{
public virtual IDictionary<string, object> GetHtmlAttributes<TProperty>
(Expression<Func<TModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object>();
}
}
class FooModel : ModelBase<FooModel>
{
public override IDictionary<string, object> GetHtmlAttributes<TProperty>
(Expression<Func<FooModel, TProperty>> propertyExpression)
{
return new Dictionary<string, object> { { "foo", "bar" } };
}
}
Run Code Online (Sandbox Code Playgroud)
小智 14
我有同样的问题,我的解决方案:
在web.config文件中:
<compilation debug="true>
必须改为
<compilation debug="true" targetFramework="4.0">
| 归档时间: |
|
| 查看次数: |
85494 次 |
| 最近记录: |