ASP.NET Core MVC 标签助手参数中的字符串字面量

5
Razor允许将ASP.NET Core MVC标签助手的参数编写为相应属性声明中的内联C#表达式。但是,由于HTML属性由引号分隔,如果这样的表达式本身包含引号,那么语法是什么呢?
以下是来自https://learn.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring的示例:
<website-information info="new WebsiteContext {
    Version = new Version(1, 3),
    CopyrightYear = 1638,
    Approved = true,
    TagsToShow = 131 }" />

如果WebsiteContext的属性之一采用字符串字面值,那么会是什么样子?
3个回答

8
如果您在new表达式中使用@(...),它会被视为C#代码,因此您将不会遇到问题。
像这样:
<website-information info="@(new WebsiteContext {
                            Version = new Version(1, 3),
                            CopyrightYear = "1638",
                            Approved = true,
                            TagsToShow = 131 })" />

这个答案应该被接受,因为它适用于任何字符串字面量和任何C#代码(如答案中所提到的),即使它包含多个字符串或字符串包含单引号。在使用正则表达式将遗留代码迁移到<partial>标签助手时非常有效。 - Lukas Körfer

6

由于我的原始答案有缺陷,这里提供一种我已经在类似你的代码上测试过的方法:

如果CopyrightYear是一个字符串,你可以使用单引号作为外层引号,并使用双引号来表示字符串,像这样:

 <website-information info='new WebsiteContext {
                                Version = new Version(1, 3),
                                CopyrightYear = "1638",
                                Approved = true,
                                TagsToShow = 131 }' />

使用您的方法和ASP.NET Core MVC 1.1,我得到了以下错误信息:在处理此请求所需的资源编译过程中发生错误。请查看以下特定错误详细信息并适当修改您的源代码。[...]无效的表达式项''[...]CopyrightYear = "1638",[...]意外字符''。 - Fabian Schmied
可能是因为您的WebsiteContext对象中的CopyrightYear当前是int类型。将其更改为string类型并查看。或者尝试使用“\”转义技术来处理其他类型为string的属性。 - RonC
这不是问题所在,我当然先将类型更改为字符串了。(我还尝试了另一个字符串属性。)这对你有用吗?如果是,你使用的是哪个ASP.NET Core版本?这可能是2.0的新功能吗? - Fabian Schmied
我的错,我假设转义引号会起作用,因为这是许多情况下都有效的方法,但不幸的是,在这种情况下它不起作用,所以我提供了一种替代方法,我已经测试过,对于这种情况是有效的。 - RonC
只要我不需要混合使用字符串和字符字面量(或在字符串字面量中使用撇号),这是一个可行的解决方法,但我会保持问题开放一段时间,看看是否有其他替代想法。 - Fabian Schmied
接受答案的前提是实际上没有办法避免引号,因此必须使用解决方法。 - Fabian Schmied

0
作为 Ron C 答案中描述的替代解决方案,我们还可以将 WebSiteContext 构造代码放入一个单独的 Razor 代码块中,并将结果存储在一个变量中。
@{
var context = new WebsiteContext {
        Version = new Version(1, 3),
        CopyrightYear = "1638",
        Approved = true,
        TagsToShow = 131 };
}

<website-information info="@context" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接