![](/img/trans.png)
[英]Cannot convert lambda expression to type 'object' because it is not a delegate type
[英]Webgrid: Cannot convert lambda expression to type 'object' because it is not a delegate type
我试图用以下代码在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表达式中使用嵌入式剃刀字符串,因为@Alessandro D'Andra建议您必须使用x => "<img src='" + someString + "'></img>";
代替。
您可能还必须将所有内容包装在MvcHtmlString
以防止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);
在lambda表达式中使用嵌入式文本语法@<text>
会创建明显不正确的C#代码。 使嵌入的标签成为lambda表达式的一部分还不够聪明,相反,它通过插入代码以立即发出嵌入的文本来破坏lambda表达式。
一切皆有可能,请尝试以下操作:
@model List<LoUCore.Models.Artifact>
@{
var grid = new WebGrid(Model);
}
@grid.GetHtml(columns: grid.Columns(
grid.Column("Filepath", header: "Sprite", format: x =>
((Func<dynamic, object>)(@<text><img src="@x.Filepath"></img></text>)).Invoke(x)
)
))
或者,甚至更短:
@grid.GetHtml(columns: grid.Columns(
grid.Column("Filepath", header: "Sprite", format: @<img src="@item.Filepath"></img>)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.