Почему мой код бритвы не работает с помощниками тегов в ASP.NET Core - PullRequest
0 голосов
/ 03 января 2019

Мой вопрос: почему синтаксис бритвы не будет работать внутри тега, где я использую помощники тегов?Это то, что я могу обойти, и решение проблемы было дано ЗДЕСЬ , но я до сих пор не смог выяснить, почему возникает эта проблема.


КакНапример, у меня есть тег выбора, к которому я пытаюсь добавить отключенный атрибут, только если у модели есть определенное свойство.Вот HTML:

<select 
  @(Model.Id != 0 ? "disabled" : "") 
  asp-for="QuestionType" 
  asp-items="Html.GetEnumSelectList<Enums.QuestionTypes>()" 
  id="form-type" data-parsley-required class="form-control">
</select>

Использование Razor внутри выделенных выводит следующее

<select 
  asp-for="QuestionType" 
  asp-items="Html.GetEnumSelectList<Enums.QuestionTypes>()" 
  id="form-type" data-parsley-required="" class="form-control">
</select>

Если не использовать Razor, это дает

<select 
  id="form-type" data-parsley-required="" class="form-control" 
  data-val="true" data-val-required="The QuestionType field is required." 
  name="QuestionType">
  <option selected="selected" value="0">Drop Down</option>
  <option value="10">Free Response</option>
</select>

Покаиспользуя синтаксис Razor, он, кажется, игнорирует помощники тегов и не создает HTML-код, как следует (или как ожидается).Тем не менее, использование бритвы внутри значений атрибутов, кажется, работает нормально, когда я использую ее, чтобы попытаться добавить такие вещи, как атрибуты тегов, я получаю эти проблемы.Как было сказано ранее, я просто пытаюсь понять, почему это происходит.

1 Ответ

0 голосов
/ 03 января 2019

Вы не можете использовать выражение Razor внутри самого тега, только внутри кавычек атрибута.Я на самом деле удивлен, что это не вызвало исключения, но, похоже, он просто решил использовать тег как открытый текст.Независимо от этого вам нужно сделать что-то вроде следующего:

<select 
  disabled="@(Model.Id != 0 ? "disabled" : null)"
  asp-for="QuestionType" 
  asp-items="@Html.GetEnumSelectList<Enums.QuestionTypes>()" 
  id="form-type" data-parsley-required class="form-control">
</select>

Если значение атрибута равно нулю, Razor удалит его, поэтому вы получите disabled="disabled", если Model.Idне равно 0, и не отключен атрибут вообще, если это так.Вам не нужно делать ничего сумасшедшего, как подсказывают ответы в связанном вопросе.

РЕДАКТИРОВАТЬ

Думая об этом больше, я думаю, что это произошло только потому, что выразбил тег на несколько строк, так что в основном Razor рассматривал окружающий тег как недопустимый HTML и хонинговал в строке, которую он мог проанализировать (троичное выражение).Я думаю, если вы поместите тег в одну строку, вы получите исключение.В любом случае, это синтаксическая ошибка.

...