Строковые литералы в вспомогательных аргументах тега MVC ASP.NET Core

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 принимало строковый литерал?


person Fabian Schmied    schedule 28.08.2017    source источник


Ответы (3)


Поскольку мои исходные ответы были ошибочными, вот подход, который будет работать, который я тестировал на коде, похожем на ваш:

Если CopyrightYear является строкой, вы можете использовать одинарные кавычки для внешних кавычек и использовать двойные кавычки для строк, например:

 <website-information info='new WebsiteContext {
                                Version = new Version(1, 3),
                                CopyrightYear = "1638",
                                Approved = true,
                                TagsToShow = 131 }' />
person RonC    schedule 28.08.2017
comment
С вашим подходом и ASP.NET Core MVC 1.1 я получаю следующее: произошла ошибка во время компиляции ресурса, необходимого для обработки этого запроса. Просмотрите следующие сведения об ошибках и соответствующим образом измените исходный код. [...] Недействительный термин выражения '' [...] CopyrightYear = \ 1638 \, [...] Неожиданный символ '\' - person Fabian Schmied; 28.08.2017
comment
Это может быть потому, что CopyrightYear в вашем объекте WebsiteContext в настоящее время имеет тип int. Измените его на строку типа и посмотрите. Или попробуйте метод \ escape с другим свойством типа string. - person RonC; 28.08.2017
comment
Дело не в том, я, конечно, сначала поменял тип на строковый. (И я также пробовал это с другим строковым свойством.) Действительно ли это работает для вас? И если да, то какую версию ASP.NET Core вы используете? Может ли это быть функция 2.0? - person Fabian Schmied; 29.08.2017
comment
Плохо, я предположил, что избегание кавычек сработает, потому что это подход, который работает во многих ситуациях, но, увы, он не работает в этом случае, поэтому я предоставил альтернативный подход выше, который я тестировал и действительно работает в этой ситуации. - person RonC; 29.08.2017
comment
Это жизнеспособный обходной путь, если мне не нужно смешивать строковые и символьные литералы (или, я думаю, использовать апостроф внутри строкового литерала), но я оставлю вопрос открытым на некоторое время, чтобы посмотреть, есть ли альтернативные идеи. . - person Fabian Schmied; 06.09.2017
comment
Принимая ответ при условии, что на самом деле нет способа избежать кавычек, поэтому необходимо использовать обходной путь. - person Fabian Schmied; 16.09.2017

Если вы заключите выражение new в @(...), все это будет рассматриваться как код C #, поэтому у вас не будет проблем.

Нравится:

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

В качестве альтернативного обходного пути к тому, который описан в ответе Рона Си, можно также поместить код конструкции WebSiteContext в отдельный блок кода Razor, сохранив результат в переменной.

@{
var context = new WebsiteContext {
        Version = new Version(1, 3),
        CopyrightYear = "1638",
        Approved = true,
        TagsToShow = 131 };
}

<website-information info="@context" />
person Fabian Schmied    schedule 16.09.2017