Разрешить пользователю вводить HTML-код ASP.NET MVC-ValidateInput или AllowHtml
Как я могу разрешить пользователю вводить HTML в определенное поле с помощью ASP.net MVC.
У меня есть длинная форма со многими полями, которые сопоставляются с этим сложным объектом в контроллере.
Я хотел бы сделать одно поле (Описание) разрешить HTML, который я буду предварительно формировать свою собственную санитарию на более позднем этапе.
9 ответов:
добавьте следующий атрибут action (post) в контроллере, для которого вы хотите разрешить HTML:
[ValidateInput(false)]Edit: по состоянию на Charlino комментарии:
в интернете.конфигурация установите используемый режим проверки. Смотрите MSDN:
<httpRuntime requestValidationMode="2.0" />Редактировать Сентябрь 2014: по состоянию на sprinter252 комментарии:
теперь вы должны использовать . Смотрите ниже MSDN:
для ASP.NET приложения MVC 3, когда вам нужно отправить HTML обратно ваша модель, не используйте ValidateInput(false), чтобы отключить запрос Утверждение. Просто добавьте [AllowHtml] к свойству модели, например:
public class BlogEntry { public int UserId {get;set;} [AllowHtml] public string BlogText {get;set;} }
добавить модели:
using System.Web.Mvc;и к вашей собственности
[AllowHtml] [Display(Name = "Body")] public String Body { get; set; }этот код с моей точки лучший способ избежать этой ошибки. Если вы используете редактор HTML, у вас не будет проблем с безопасностью, потому что он уже ограничен.
добавлять
[AllowHtml]по конкретному свойству является рекомендуемым решением, так как есть много блогов и комментариев, предлагающих снизить уровень безопасности, что должно быть неприемлемо.добавляя это, платформа MVC позволит контроллеру быть пораженным и код в этом контроллере будет выполнен.
, Это зависит от вашего кода, фильтров и т. д. как генерируется ответ и есть ли какая-либо дополнительная проверка, которая может вызвать другую подобная ошибка.В любом случае, добавив
[AllowHtml]атрибут-это правильный ответ, так как он позволяет десериализовать html в контроллере. Пример в вашем viewmodel:[AllowHtml] public string MessageWithHtml {get; set;}
я столкнулась с той же проблемой, хотя я добавил
[System.Web.Mvc.AllowHtml]к соответствующему свойству, как описано в некоторых ответах.в моем случае, у меня есть
UnhandledExceptionFilterкласс, который обращается к объекту запрос до проверка MVC происходит (и поэтому AllowHtml не имеет эффекта) , и этот доступ вызывает[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client.это означает, что доступ к определенным свойствам объекта запроса неявно запускает проверку (в моем случае это
Paramsсвойства).A решение для предотвращения проверки задокументировано на MSDN
чтобы отключить проверку запроса для определенного поля в запросе (например, для входного элемента или значения строки запроса), вызовите запрос.Непроверенный метод при получении элемента, как показано в следующем примере
поэтому, если у вас есть такой код
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) { ...
Если вам нужно разрешить ввод HTML для параметр метода действия (в отличие от" свойства модели") нет встроенного способа сделать это, но вы можете легко достичь этого, используя пользовательскую привязку модели:
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/
я столкнулся с этой проблемой во время разработки сайта электронной коммерции с использованием NopCommerce, я получил это решение 3 различными способами, как и предыдущие ответы. Но согласно структуре NopCommerce я не нашел этих трех за раз. Я только что видел, что там они используют только
[AllowHtml]и все работает нормально, за исключением каких либо проблем. Как ранее просили вопрослично я не предпочитаю
[ValidateInput(false)]потому что я пропускаю полную проверку сущности модели, которая небезопасный. Но если кто просто напишет посмотреть здесь[AllowHtml] public string BlogText {get;set;}затем он просто пропускает только одно свойство и просто разрешает только определенное свойство и проверяет едва ли все другие объекты. Поэтому она кажется предпочтительнее моей.
в моем случае атрибут AllowHtml не работал в сочетании с фильтром действия OutputCache. ответ решил проблему для меня. Надеюсь, это кому-то поможет.
URL кодирование данных работает также и для меня
var data = ' Hello'
в браузере вызовите encodeURIComponent (data) перед публикацией
на сервере вызов HttpUtility.UrlDecode (received_data) для декодирования
таким образом, вы можете точно контролировать, какие поля области разрешено иметь html
Comments