我正在编写覆盖以提供自己的MVC控件实现。我想使用可选参数,这样就省去了编写和维护多个覆盖的工作,就像我现在解决了它一样。
我的电话示例
public static MvcHtmlString MyControlFor<TModel, TValue>(this HtmlHelper<TModel> html
, Expression<Func<TModel, TValue>> expression
, object htmlAttributes = null
, params Expression<Func<TModel, object>>[] expressions)
使用可选参数而不提供所有参数时,我需要使用命名参数。我也知道在这种情况下你需要将一个数组对象传递给params参数才能工作。但它在这里我无法弄清楚我是如何做到的。
调用以下内容会出现以下错误(CS0826:找不到隐式类型数组的最佳类型):
@Html.MyControlFor(x => x.property, expressions: new [] { x=>x.property2, x=>x.property3 });
传递强类型数组似乎也不是解决方案,因为编译器无法识别Expression类。所以以下似乎不起作用
@Html.MyControlFor(x => x.property
, expressions: new Expression<Func<TModel, object>>[] { x=>x.property2, x=>x.property3 });
有没有人知道如何才能使这项工作?或者我注定要继续使用覆盖?
答案 0 :(得分:0)
您可以将使用语句添加到Razor视图中,如下所示:
@using System.Linq.Expressions
答案 1 :(得分:0)
您不能将System.Linq命名空间添加到剃刀视图的原因是因为razor基于动态类型而System.Linq命名空间仅包含扩展方法。由于动态类型仅在运行时已知,因此您无法在其上使用扩展方法。