您不能在 lambda 表达式中使用嵌入的 razor 字符串,因为@Alessandro D'Andra 建议您必须x => "<img src='" + someString + "'></img>";
改用它。
您可能还必须将其全部包装在 an 中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);
@<text>
在 lambda 表达式中使用嵌入的文本语法会创建明显不正确的 C# 代码。将嵌入标签作为 lambda 表达式的一部分是不够聪明的,相反,它通过插入代码以立即发出嵌入文本来破坏 lambda 表达式。