使用lambda从Razor Partial View向Helper类指定属性

时间:2011-08-24 15:48:23

标签: asp.net-mvc asp.net-mvc-3 lambda razor

我正在尝试编写一个EditorTemplate来一般地应用CSS类,这些类依赖于在传递模型的助手中提供的逻辑以及来自ViewBag的其他数据:

@using LSC.DCMP.Web.UI.Helpers
@model String

@ValidationFieldHelper.GetCSSClass(m => Model, @ViewBag.Step) 

这与当前未实现的辅助类匹配,但具有以下签名:

public static class ValidationFieldHelper
{
    public static object GetCSSClass(Func<object, string> func, object step)
    {
        throw new NotImplementedException();
    }
}

当我尝试运行应用程序时,编译失败并出现以下错误:

  

“不能将lambda表达式用作动态调度操作的参数,而不先将其转换为委托或表达式树类型。”

我已经读过使用Razor模板不完全支持lambda语法,所以我不确定如何实现这个功能。

2 个答案:

答案 0 :(得分:4)

问题与lambda无关,而是与您正在使用的动态@ViewBag有关,这会导致动态调度该语句,如错误消息中所述。

Major Byte提供的另外两个选项:

  1. 投射动态,让编译器知道动态将解析的内容

    @ValidationFieldHelper.GetCSSClass(m => Model, (object)@ViewBag.Step)
    
  2. 在使用之前将动态设置为变量(基本上与上述相同)

    @{ object vstep = ViewBag.Step; }
    @ValidationFieldHelper.GetCSSClass(m => Model, vstep)
    
  3. 这两个都为我抛出了正确的例外。

答案 1 :(得分:0)

@ValidationFieldHelper.GetCSSClass((Func<object, string>) (m => Model), @ViewBag.Step)

为你工作? 这不是最干净的解决方案,但我可以让它抛出NotImplementedException ...