Я получил это:
DataTable dtEntity = CreateDataTable();
drEntity = dtEntity.NewRow();
Тогда я добавляю данные к строке (или не). Много кода, действительно не знайте, существует ли что-нибудь в строке. Зависит от входа (я импортирую из некоторых файлов). Я хотел бы сделать что-то как:
if (drEntity`s EVERY CELL IS NOT EMPTY)
{
dtEntity.Rows.Add(drEntity);
}
else
{
//don't add, will create a new one (drEntity = dtEntity.NewRow();)
}
Там некоторый хороший путь состоит в том, чтобы проверить, пуста ли каждая ячейка DataRow? Или я должен foreach, и проверять их один за другим?
Простой метод типа:
bool AreAllColumnsEmpty(DataRow dr)
{
if (dr == null)
{
return true;
}
else
{
foreach(var value in dr.ItemArray)
{
if (value != null)
{
return false;
}
}
return true;
}
}
Должен дать вам то, что вы ищете, а чтобы сделать его "красивым" (поскольку в Framework, насколько я знаю, ничего такого нет), вы можете обернуть его как метод расширения, и тогда ваш результирующий код будет выглядеть так:
if (datarow.AreAllColumnsEmpty())
{
}
else
{
}
public static bool AreAllCellsEmpty(DataRow row)
{
if (row == null) throw new ArgumentNullException("row");
for (int i = row.Table.Columns.Count - 1; i >= 0; i--)
if (!row.IsNull(i))
return false;
return true;
}
Вы можете использовать следующее:
if(drEntity.ItemArray.Where(c => IsNotEmpty(c)).ToArray().Length == 0)
{
// Row is empty
}
IsNotEmpty(cell)
будет вашей собственной реализацией, проверяющей, являются ли данные нулевыми или пустыми, основываясь на том, какой тип данных находится в ячейке. Если это простая строка, то в итоге это может выглядеть примерно так:
if(drEntity.ItemArray.Where(c => c != null && !c.Equals("")).ToArray().Length == 0)
{
// Row is empty
}
else
{
// Row is not empty
}
Тем не менее, по сути, это проверяет каждую ячейку на пустоту и позволяет узнать, все ли ячейки в строке пусты.
Хотя это не ответ на ваш главный вопрос, стоит отметить, что когда MVC генерирует имена, это превращает что-то вроде Тэги в Project_Tags, заменяя точки подчеркиванием.
Причиной этого является то, что точка в идентификаторе элемента будет выглядеть как элемент Project с классом Тэгов к CSS. Ясно, что это плохо, поэтому перевод подчеркивает, чтобы держать поведение предсказуемым.
В вашем первом примере
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
listbox пытается выполнить привязку к Model.Project.Categories для сильно типизированной модели, которая была предоставлена странице (с помощью лямбда-нотации). Я не уверен, что делает второй параметр в ListAxFor.
Какова модель, передаваемая на страницу?
-121--1362042-Невозможно указать или изменить белый список с помощью библиотеки AntiXSS, что не странно, когда вы думаете об этом. Библиотека AntiXSS по умолчанию кодирует все символы, не входящие в следующий диапазон: 0..9a..zA..Z. Этот набор символов безопасен (и поэтому находится в белом списке), и их кодирование не требуется. Обратите внимание, что библиотека AntiXSS содержит различные списки для кодирования javascript, html и url. Не используйте HTML-код для URL-адресов, так как в приложении будет пробел безопасности.
Обратите внимание, что белый список в GroupEncode
работает иначе, чем белый список в GetSafeGroupFragment
. С помощью GroupEncode
вы говорите «пожалуйста, закодируйте каждый символ, который отсутствует в белом списке», с помощью GetSafeGroupFragment
вы говорите «пожалуйста, удалите все тэги и атрибуты, которые отсутствуют в белом списке».
Когда вы используете ASP.NET 4.0, я был бы совет вы, чтобы не пользоваться библиотекой AntiXSS (непосредственно), но просто использовать построенный в механизмах (таких как HttpUtility), чтобы закодировать HTML. ASP.NET 4.0 позволяет настроить в файле конфигурации . Вы можете написать свой собственный StartEncoder
, использующий библиотеку AntiXSS (вполне вероятно, что будущая версия библиотеки AntiXSS будет содержать реализацию StartEncoder
). При этом все приложение (и все ASP.NET элементы управления и пользовательские элементы управления) будет использовать кодировку белого списка вместо кодировки черного списка.
ASP.NET 4,0 также вводит новый кодовый блок для кодированного текста . Можно использовать имя: <%: Model.FirstName% >
. Тем не менее, я лично нахожу <% = StartUtility.StartEncode (Model.FirstName)% >
более явным.
AFAIK, нет метода, который делает это в рамках. Даже если бы в рамках была поддержка чего-то подобного, она, по сути, делала бы то же самое. И это будет смотреть на каждую ячейку в DataRow, чтобы увидеть, является ли она пустой.
Возможно, лучшим решением было бы добавить дополнительный столбец, который автоматически устанавливается в 1 в каждой строке. Как только появится элемент, который не является нулевым, измените его на 0.
затем
If(drEntitity.rows[i].coulmn[8] = 1)
{
dtEntity.Rows.Add(drEntity);
}
else
{
//don't add, will create a new one (drEntity = dtEntity.NewRow();)
}