【问题标题】:Params parameter when using optional paramters使用可选参数时的 Params 参数
【发布时间】:2013-06-14 05:52:41
【问题描述】:

我目前正在编写重写以提供自己的 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 });

有没有人知道我怎样才能做到这一点?还是我注定要继续使用覆盖?

【问题讨论】:

  • 包括 System.Linq?这在我看来应该可以工作。我想知道 Expression 是否存在于命名空间中的其他地方,因为它完全不同。不过,我对 MVC 并不熟悉。
  • 您的强类型版本应该可以使用。至少它与我的 Visual Studio 2012 一起编译没有错误。您说编译器无法识别 Expression 类,您是否有“使用 System.Linq.Expressions;”代码中的语句?

标签: c# asp.net-mvc generics razor


【解决方案1】:

您可以像这样向 Razor 视图添加 using 语句:

@using System.Linq.Expressions

【讨论】:

  • 我没有对 System.Linq.Expressions 的 System.Linq 的引用。看来我无法在我的视图中添加它(剃刀语法)
【解决方案2】:

不能将 System.Linq 命名空间添加到 razor 视图的原因是因为 razor 是基于动态类型的,而 System.Linq 命名空间仅包含扩展方法。由于动态的类型仅在运行时才知道,因此您不能在其上使用扩展方法。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多