【问题标题】:String literals in ASP.NET Core MVC tag helper argumentsASP.NET Core MVC 标签助手参数中的字符串文字
【发布时间】:2018-02-05 17:45:21
【问题描述】:

Razor 允许将 ASP.NET Core MVC 标签助手的参数编写为相应属性声明中的内联 C# 表达式。但是,由于 HTML 属性是用引号分隔的,如果这样的表达式本身应该包含引号,语法是什么?

这是来自https://docs.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 属性之一采用字符串文字,这会是什么样子?

【问题讨论】:

    标签: c# razor asp.net-core asp.net-core-tag-helpers


    【解决方案1】:

    如果您将 new 表达式包装在 @(...) 中,它将全部被视为 C# 代码,因此您不会遇到问题。

    像这样:

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

    【讨论】:

      【解决方案2】:

      由于我的原始答案存在缺陷,因此我在类似于您的代码上测试了一种可行的方法:

      如果 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\", [...] 意外字符 '\'
      • 这可能是因为您的 WebsiteContext 对象中的 CopyrightYear 当前是 int 类型。将其更改为输入字符串并查看。或者尝试使用其他字符串类型的属性的 \" 转义技术。
      • 不是这样的,我当然是先把type改成string了。 (我还尝试了另一个字符串属性。)这真的对你有用吗?如果是,您使用的是什么 ASP.NET Core 版本?这可能是 2.0 的功能吗?
      • 我的错,我认为转义引号会起作用,因为它是一种在许多情况下都有效的方法,但可惜在这种情况下它不起作用,所以我在上面提供了一种替代方法,我已经测试过并且确实如此为这种情况工作。
      • 这是一个可行的解决方法,只要我不需要混合字符串和字符文字(或者在字符串文字中使用撇号,我猜),但我会把这个问题留待看看有没有其他的想法。
      【解决方案3】:

      作为 Ron C 的回答中描述的替代解决方法,也可以将 WebSiteContext 构造代码放入单独的 Razor 代码块中,将结果存储在变量中。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 2020-06-20
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多