Разрешить пользователю вводить HTML в ASP.NET MVC - ValidateInput или AllowHtml
Как я могу позволить пользователю вводить HTML в конкретное поле с помощью ASP.net MVC.
У меня длинная форма со многими полями, которые отображаются в этом сложном объекте в контроллере.
Я хотел бы, чтобы одно поле (описание) разрешило HTML, который я предварительно заработаю на моей собственной санитарии в дальнейшем.
Ответы
Ответ 1
Добавьте следующий атрибут action (post) в контроллер, для которого вы хотите разрешить HTML:
[ValidateInput(false)]
Изменить: По Charlino комментариям:
В вашем web.config задан режим проверки. См. MSDN:
<httpRuntime requestValidationMode="2.0" />
Изменить сентябрь 2014: По sprinter252 комментариям:
Теперь вы должны использовать атрибут [AllowHtml]
. См. Ниже MSDN:
Для приложений ASP.NET MVC 3, когда вам нужно отправить HTML обратно в вашей модели, не используйте ValidateInput (false), чтобы отключить Request Проверка. Просто добавьте [AllowHtml] к свойству модели, например:
public class BlogEntry {
public int UserId {get;set;}
[AllowHtml]
public string BlogText {get;set;}
}
Ответ 2
Что относительно атрибута [AllowHtml]
выше свойства?
Ответ 3
Добавить в модель:
using System.Web.Mvc;
И к вашей собственности
[AllowHtml]
[Display(Name = "Body")]
public String Body { get; set; }
Этот код с моей точки зрения лучше всего избежать этой ошибки. Если вы используете HTML-редактор, у вас не будет проблем с безопасностью, поскольку он уже ограничен.
Ответ 4
Добавление [AllowHtml]
в конкретное свойство является рекомендуемым решением, так как есть много блогов и комментариев, предлагающих снизить уровень безопасности, что должно быть неприемлемым.
Добавив, что структура MVC позволит Controller быть нажата, а код в этом контроллере будет выполнен.
Однако это зависит от вашего кода, фильтров и т.д. от того, как генерируется ответ, и существует ли какая-либо дополнительная проверка, которая может вызвать другую аналогичную ошибку.
В любом случае добавление атрибута [AllowHtml]
- правильный ответ, так как он позволяет десериализовать html в контроллере. Пример в вашей модели просмотра:
[AllowHtml]
public string MessageWithHtml {get; set;}
Ответ 5
У меня возникла такая же проблема, хотя я добавил [System.Web.Mvc.AllowHtml]
к соответствующему свойству, как описано в некоторых ответах.
В моем случае у меня есть класс UnhandledExceptionFilter
, который обращается к объекту Request до проверки MVC (и поэтому AllowHtml не действует), и этот доступ вызывает [HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
.
Это означает, что доступ к определенным свойствам объекта Request неявно вызывает проверку (в моем случае это свойство Params
).
Решение для предотвращения проверки документируется на MSDN
Чтобы отключить проверку запроса для определенного поля в запросе (например, для элемента ввода или значения строки запроса), вызовите метод Request.Unvalidated при получении элемента, как показано в следующем примере
Поэтому, если у вас есть такой код,
var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
...
измените его на
var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;
var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
...
или просто используйте свойство Form
, которое, похоже, не срабатывает при проверке
var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
...
Ответ 6
Если вам нужно разрешить ввод html для параметра action-method (в отличие от "свойства модели"), встроенного способа сделать это нет, но вы можете легко добиться этого, используя привязку пользовательской модели:
public ActionResult AddBlogPost(int userId,
[ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
//...
}
Код AllowHtmlBinder:
public class AllowHtmlBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var name = bindingContext.ModelName;
return request.Unvalidated[name]; //magic happens here
}
}
Найдите полный исходный код и объяснение в моем блоге: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
Ответ 7
Я столкнулся с этой проблемой во время разработки сайта электронной коммерции с использованием NopCommerce, я получил это решение тремя способами, как в предыдущих ответах. Но, согласно структуре NopCommerce, я не нашел этих трех за раз. Я только что видел, что они используют только [AllowHtml]
, и он отлично работает, за исключением любой проблемы. Как ранее было задано question
Лично я не предпочитаю [ValidateInput(false)]
, потому что я пропускаю проверку общей модели объекта, что небезопасно. Но если кто-то просто напишет посмотрите здесь
[AllowHtml]
public string BlogText {get;set;}
то он просто пропускает только одно свойство и просто разрешает только конкретное свойство и проверяет почти все остальные объекты. Поэтому это кажется предпочтительным по отношению к моим.
Ответ 8
В моем случае атрибут AllowHtml не работал в сочетании с фильтром действий OutputCache. Этот ответ решил проблему для меня. Надеюсь, это поможет кому-то.
Ответ 9
URL-кодирование данных работает для меня
Например
var data = '<b> Hello </b>'
В браузере вызовите encodeURIComponent (data) перед публикацией
На сервере вызов HttpUtility.UrlDecode (полученный_данных) для декодирования
Таким образом, вы можете точно контролировать, в какой области полей может быть html