c# - 网络网格 : Cannot convert lambda expression to type 'object' because it is not a delegate type

标签 c# asp.net razor

我尝试使用以下代码在 webgrid 列中添加 html 图像:

@model List<LoUCore.Models.Artifact>
@{    
   var grid = new WebGrid(Model);
   List<WebGridColumn> column = new List<WebGridColumn>();
   column.Add(new WebGridColumn { ColumnName = "Filepath", Header = "Sprite",Format = (x => @<text><img src="@x.Filepath"></img></text>) });
 }
@grid.GetHtml(columns: grid.Columns(column.ToArray()))

但我收到以下错误:

CS1660: Cannot convert lambda expression to type 'object' because it is not a delegate type

有什么想法吗?

最佳答案

您不能在 lambda 表达式中使用嵌入的 Razor 字符串,因为 @Alessandro D'Andra 建议您必须使用 x => "<img src='" + someString + "'></img>";相反。

您可能还必须将其全部包装在 MvcHtmlString 中防止 Razor 在格式化程序使用字符串后转义字符串,但我不知道格式化程序到底是如何工作的 - 你必须尝试一下。

我制作了一个小测试文件,以准确了解 Razor 编译器将如何处理您的代码。这是 Razor 文件:

@{
    string someString = "somestring";

    Func<object, object> a = x => "<text><img src='" + someString + "'></img></text>";
    Func<object, object> b = x => @<text><img src="@someString"></img></text>);  
}

ASP.NET 编译器从中创建此 C# 代码(仅包含相关部分):

    string someString = "somestring";

    Func<object, object> a = x => "<text><img src='" + someString + "'></img></text>";
    Func<object, object> b = x => 

            #line default
            #line hidden
item => new System.Web.WebPages.HelperResult(__razor_template_writer => {

BeginContext(__razor_template_writer, "~/Views/Home/Index.cshtml", 210, 4, true);

WriteLiteralTo(__razor_template_writer, "<img");

EndContext(__razor_template_writer, "~/Views/Home/Index.cshtml", 210, 4, true);

WriteAttributeTo(__razor_template_writer, "src", Tuple.Create(" src=\"", 214), Tuple.Create("\"", 231)

            #line 7 "c:\temp\MvcApplication1\Views\Home\Index.cshtml"
, Tuple.Create(Tuple.Create("", 220), Tuple.Create<System.Object, System.Int32>(someString

            #line default
            #line hidden
, 220), false)
);

BeginContext(__razor_template_writer, "~/Views/Home/Index.cshtml", 232, 7, true);

WriteLiteralTo(__razor_template_writer, "></img>");

EndContext(__razor_template_writer, "~/Views/Home/Index.cshtml", 232, 7, true);

使用嵌入文本语法 @<text> lambda 表达式内会创建明显不正确的 C# 代码。它不够聪明,无法将嵌入标签作为 lambda 表达式的一部分,而是通过插入代码立即发出嵌入文本来破坏 lambda 表达式。

关于c# - 网络网格 : Cannot convert lambda expression to type 'object' because it is not a delegate type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18291100/

相关文章:

c# - 如何将数据项添加到 List<Struct>

javascript - 使用razor View 时无法在javascript中提供@

javascript - 如何转换为 json 特定类 c# ?我有错误

c# - 使用 C# 读取发布数据

c# - 在C#.NET中,如何给HTML、CSS等静态文件引用添加版本号?

asp.net - 中止/跳过/取消 Razor View 的渲染

c# - 如何避免重复内联条件来定义 Html.EditorFor() 的 htmlAttributes

c# - WIX - 添加 C# 自定义操作代码

c# - await 将 HttpContext.Current 设置为 null/prior - 无法手动设置

c# - 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 失败