Переменная strCSSClass часто имеет значение, но иногда бывает пустым.
Я не хочу включать пустой class = "" в HTML этого элемента ввода, что означает, что если strCSSClass пуст, мне вообще не нужен атрибут class =.
Ниже приведен один из способов создания условного атрибута HTML:
<input type="text" id="@strElementID" @(CSSClass.IsEmpty() ? "" : "class=" + strCSSClass) />
Есть ли более элегантный способ сделать это? В частности, тот, в котором я мог бы следовать тому же синтаксису, что и в других частях элемента: class = "@ strCSSClass"?
источник
Обратите внимание, что вы можете сделать что-то вроде этого (по крайней мере, в MVC3):
То, что я считал добавлением кавычек бритвой, на самом деле было браузером. Как указал Ризм при тестировании с MVC 4 (я не тестировал с MVC 3, но предполагаю, что поведение не изменилось), это действительно дает,
class=TopBorder
но браузеры могут разбирать это нормально. Парсеры HTML несколько снисходительны к отсутствию кавычек атрибутов, но это может сломаться, если у вас есть пробелы или определенные символы .ИЛИ
Что не так с предоставлением собственных цитат
Если вы попытаетесь использовать некоторые из обычных соглашений C # для вложенных кавычек, у вас будет больше кавычек, чем вы рассчитывали, потому что Razor пытается их безопасно избежать. Например:
Это должно быть оценено как,
<button type="button" style="border:0px">
но Razor экранирует весь вывод C # и, таким образом, производит:Вы увидите это, только если посмотрите ответ по сети. Если вы используете инспектор HTML, часто вы фактически видите DOM, а не необработанный HTML. Браузеры анализируют HTML в DOM, и к представлению DOM после анализа уже применены некоторые тонкости. В этом случае браузер видит, что вокруг значения атрибута нет кавычек, и добавляет их:
Но в инспекторе DOM коды символов HTML отображаются правильно, поэтому вы действительно видите:
В Chrome, если вы щелкните правой кнопкой мыши и выберите «Редактировать HTML», он переключится обратно, чтобы вы могли видеть эти неприятные коды символов HTML, давая понять, что у вас есть настоящие внешние кавычки и внутренние кавычки в кодировке HTML.
Таким образом, проблема с попыткой цитирования самостоятельно заключается в том, что Razor избегает этого.
Если вы хотите полный контроль над котировками
Используйте Html.Raw для предотвращения экранирования кавычек:
Отображается как:
Вышесказанное совершенно безопасно, потому что я не выводлю HTML из переменной. Единственная задействованная переменная - это тернарное условие. Однако имейте в виду, что этот последний метод может привести к определенным проблемам безопасности при построении строк из данных, предоставленных пользователем. Например, если вы создали атрибут из полей данных, созданных из данных, предоставленных пользователем, использование Html.Raw означает, что строка может содержать преждевременное окончание атрибута и тега, а затем начать тег сценария, который что-то делает от имени текущего пользователя, вошедшего в систему. пользователь (возможно, отличный от зарегистрированного пользователя). Возможно, у вас есть страница со списком всех изображений пользователей, и вы настраиваете всплывающую подсказку для имени пользователя каждого человека, и один пользователь назвал себя
'/><script>$.post('changepassword.php?password=123')</script>
и теперь любой другой пользователь, просматривающий эту страницу, мгновенно меняет свой пароль на пароль, который злоумышленник знает.источник
Думаю, более удобный и структурированный способ - использовать помощник Html. На ваш взгляд, это может выглядеть так:
Если этот способ будет вам полезен, я рекомендую определить словарь
htmlAttr
в вашей модели, чтобы ваше представление не нуждалось в каких-либо@{ }
логических блоках (будьте более ясными).источник