Разрешить пользователю вводить HTML-код ASP.NET MVC-ValidateInput или AllowHtml



Как я могу разрешить пользователю вводить HTML в определенное поле с помощью ASP.net MVC.



У меня есть длинная форма со многими полями, которые сопоставляются с этим сложным объектом в контроллере.



Я хотел бы сделать одно поле (Описание) разрешить HTML, который я буду предварительно формировать свою собственную санитарию на более позднем этапе.

541   9  

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;}
 }

а как же [AllowHtml] атрибут вышеуказанное имущество?

добавить модели:

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

    Ничего не найдено.