Я думал, что @ в Razor означает код C #. Итак, в приведенном ниже коде я бы не стал вводить еще один @ перед Html.Raw(), потому что он уже заключен в код C #:

@if (Session["User"] == null)
{
    Html.Raw("Welcome User <br>");
}

Но оказывается, что помощнику действительно требуется @, прежде чем он обозначит свой контекст , как упоминалось здесь < / a> иначе ничего бы не сгенерировали.

Может кто-нибудь объяснить, почему это более подробно?

2
lbrahim 21 Дек 2013 в 23:14
- хороший момент ... это не должно быть дублированием ни "почему @ используется перед строковой константой", ни "почему @ используется в идентификаторах" ... Я отредактировал образец, чтобы избежать одного лишнего @.
 – 
Alexei Levenkov
21 Дек 2013 в 23:24

1 ответ

Лучший ответ

Другой пост объясняет, почему вам нужен дополнительный символ @ перед кодом Html.Row.

В основном вы можете думать об этом так:

  • первый @ перед if указывает, что код в блоке if является кодом C # и будет проанализирован как таковой.

  • когда выполняется код C #, Html.Raw(...) генерирует объект MvcHtmlString, но вы на самом деле ничего с ним не делаете. Если бы вы писали чистый код, возможно, вы бы написали код для отправки MvcHtmlString в буфер вывода ответа или что-то подобное.

Итак, второй @, который вам может понадобиться перед Html.Raw(..), на самом деле является сокращенным способом указать, что вы хотите, чтобы результат функции отображался в контексте вывода, а не быть просто оставленным болтающимся.

Может быть полезен другой пример. Этот пример только косвенно связан с вашим вопросом Razor - относительно концепции выполнения функций и отбрасывания результата.

Допустим, у вас есть следующее определение функции:

  int Add(int a, int b)
  {
      return a + b;
  }

Теперь вы можете вызвать эту функцию так:

  Add(2, 3);

Приведенный выше код выполнит добавление, но результат будет отброшен. Вы ничего не делаете с этим. Сравните это с:

  Console.WriteLine(Add(2, 3));    // now the result is being written to the console
10
Mike Dinescu 21 Дек 2013 в 23:28