На моем веб-сайте asp.net-mvc у меня есть поле, которое обычно содержит строку (из базы данных), но время от времени может ничего не содержать.
Поскольку IE не знает, как обрабатывать тег css "empty-cells", пустые ячейки таблицы необходимо заполнить с помощью & nbsp;
.
я думал
Html.Encode(" ");
исправил бы это для меня, но, по-видимому, он просто возвращает "". Я мог бы реализовать эту логику следующим образом
Html.Encode(theString).Equals(" ")?" ":Html.Encode(theString);
Также можно было бы использовать нестандартное «если», но, честно говоря, оба варианта уродливы. Нет ли более удобочитаемого и компактного способа разместить там это дополнительное пространство?
Пожалуйста, избегайте строчки "... нужно заполнить, я думал ..."
По соображениям эффективности избегайте вызова Html.Encode дважды.
Не зная языка, но разве не должно быть так: encoded = theString.Equals ("")? "": Html.Encode (theString);
Да, вы оба правы, но это был лишь способ показать, насколько нечитаемым может стать такое решение.





Вы должны найти другой способ заполнить пустую ячейку. HTML-кодирование пробела для самого себя вполне допустимо. Если вам нужно что-то еще, вы можете использовать экранирование URL-адресов или использовать собственный метод для генерации контента.
Кодирование пробела в HTML - это просто пробел. nbsp может выглядеть как пробел, но имеет другую семантику: «неразрывный» означает, что разрывы строк подавляются.
Решение: всякий раз, когда я обнаруживаю, что функциональные возможности отсутствуют или имеют неожиданное поведение (например, asp: Label и HyperLink не кодируют HTML), я пишу свой собственный класс утилит, который выполняет то, что я говорю;)
public class MyHtml
{
public static string Encode(string s)
{
if (string.IsNullOrEmpty(s) || s.Trim()= = "")
return "& nbsp;";
return Html.Encode(s);
}
}
Да, я планировал что-то подобное. Но прежде чем я начну реализовывать свое собственное (и представить возможные зависимости / ошибки изменения), я хотел убедиться, что лучшего решения нет.
Я думаю, у вас должен быть особый случай, например MyHtml.TdEncode, который делает это. Вы же не хотите добавлять nbsps везде. Кроме того, в чем разница между isNullOrEmpty (s) и s.Trim () == ""? Похоже, триммер лишний
@JuanMendes, s.Trim()= = "" необходим, потому что string.IsNullOrEmpty(s) вернет false, если s содержит только пробелы. Есть более новый string.IsNullOrWhiteSpace(s), который справляется с этим условием; но он недоступен в .NET 2.0.
Может быть проще преобразовать " " в "\xA0", а затем безоговорочно Html.Encode получить результат:
s = (string.IsNullOrEmpty(s) || s.Trim()= = "") ? "\xA0" : s;
Html.Encode(s);
Шестнадцатеричный 00A0 определяет символ Unicode для неразрывного пробела, поэтому   является эквивалентом HTML-объекта .
Если у вас есть какой-либо контроль над базой данных, вы можете преобразовать пустые поля или поля с одним пробелом в это значение "\xA0", что полностью устранит условие.
Спасибо за указатель на \xA0! Это пригодилось сегодня для чего-то похожего на это.
пришлось разбить & NBSP; потому что представление SO отображает его как HTML