Сложно ответить, учитывая, что мы не можем видеть ваши фактические модели здесь, но, вообще говоря, вам просто нужно использовать логический оператор ИЛИ:
albums = _albumRepository.Albums.Where(p =>
p.Name.ToLower().Contains(_searchString.ToLower()) ||
p.Artist.ToLower().Contains(_searchString.ToLower()) ||
p.Genre.ToLower().Contains(_searchString.ToLower())
);
Если [ 111] / Genre
на самом деле являются опорными опорами, вы просто углубитесь в них, то есть p.Artist.Name.ToLower().Contains(...)
и т. Д.
Я просто попробовал свой XElement. Решение для синтаксического анализа. Я создал дополнительный метод на строковом классе, таким образом, я могу снова использовать код легко:
public static bool ContainsXHTML(this string input)
{
try
{
XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>");
return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text);
}
catch (XmlException ex)
{
return true;
}
}
Одна проблема, которую я нашел, состояла в том, что амперсанд простого текста и меньше, чем символы вызывают XmlException и указывают, что поле содержит HTML (который является неправильным). Для фиксации этого входная строка передала в первых потребностях иметь амперсанды и меньше, чем символы, преобразованные в их эквивалентные объекты XHTML. Я записал другой дополнительный метод, чтобы сделать это:
public static string ConvertXHTMLEntities(this string input)
{
// Convert all ampersands to the ampersand entity.
string output = input;
output = output.Replace("&", "amp_token");
output = output.Replace("&", "&");
output = output.Replace("amp_token", "&");
// Convert less than to the less than entity (without messing up tags).
output = output.Replace("< ", "< ");
return output;
}
Теперь я могу взять отправленную строку пользователя и проверять, что она не содержит HTML с помощью следующего кода:
bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML();
я не уверен, пуленепробиваемо ли это, но я думаю, что это достаточно хорошо для моей ситуации.
Вы могли гарантировать простой текст путем кодирования входа с помощью HttpUtility. HtmlEncode.
На самом деле, в зависимости от того, как строгий Вы хотите, чтобы проверка была, Вы могли использовать ее, чтобы определить, содержит ли строка HTML:
bool containsHTML = (myString != HttpUtility.HtmlEncode(myString));
Здесь Вы идете:
using System.Text.RegularExpressions;
private bool ContainsHTML(string CheckString)
{
return Regex.IsMatch(CheckString, "<(.|\n)*?>");
}
, Который является самым простым путем, так как объекты в скобках вряд ли произойдут естественно.
Угловые скобки не могут быть Вашим единственным вызовом. Другие символы могут также быть потенциально вредной инжекцией сценария. Такой как общий двойной дефис "-", который может также используемый во Внедрении SQL. И существуют другие.
На странице ASP.Net, если validateRequest = верный в machine.config, web.config или директиве страницы, пользователь получит ошибочную страницу, заявляя "Потенциально опасный Запрос. Значение формы было обнаружено от клиента", если HTML-тэг или различные другие потенциальные инжекционные сценарием нападения обнаруживаются. Вы, вероятно, хотите избежать этого и обеспечить более изящное, менее - страшный опыт UI.
Вы могли протестировать и на открывающие и на закрывающие тэги <> использование регулярного выражения, и позволяет текст, если только один из них происходит. Позвольте < или>, но не < сопровождаемый некоторым текстом и затем>, в том порядке.
Вы могли позволить угловым скобкам и HtmlEncode текст для сохранения их, когда данные сохраняются.
Следующее будет соответствовать любому набору соответствия тегов. т.е. < b> this</b>
Regex tagRegex = new Regex(@"<\s*([^ >]+)[^>]*>.*?<\s*/\s*\1\s*>");
следующее будет соответствовать любому единственному тегу. т.е. < b> (это не должно быть закрыто).
Regex tagRegex = new Regex(@"<[^>]+>");
можно тогда использовать его как так
bool hasTags = tagRegex.IsMatch(myString);