#asp.net-mvc
#asp.net-mvc
Вопрос:
У меня есть форма с редактором wmd на ней. Область ввода текста отображается с использованием:
<%: Html.TextAreaFor(t => t.NewsBody, new{@class="wmd-panel", id="wmd-input"}) %>
Каждый раз, когда я отправляю форму, я получаю A potentially dangerous Request.Form value was detected from the client
Я попытался установить [ValidateInput(false)] в методе action, я попытался добавить
в web.config и я попытался
<httpRuntime requestValidationMode="2.0" /> validateRequest="false"
в директиве pages в web.config, но это все еще происходит.
Есть идеи?
Редактировать
Метод действия:
[ILFFAuthorize(Roles = "Admin")] // this is a custom auth attrobite
[HttpPost]
[ValidateInput(false)]
public ActionResult AddNews(FormCollection col){
//public ActionResult AddNews(News news)
//{
if (ModelState.IsValid)
{
News news = new News();
news.NewsDate = DateTime.Now;
news.NewsPosterId = 0;
news.NewsTitle = col["NewsTitle"];
news.NewsBody = col["NewsBody"];
newsRepository.Add(news);
newsRepository.Save();
return RedirectToAction("Index", "Home");
}
else
{
return View();
}
}
Комментарии:
1. Просто для покрытия всех оснований, ValidateInput(false) находится в методе POST, правильно?
2. извините, я думаю, вы не совсем понимаете
FormCollection
суть. MVC добавляет это автоматически при генерации метода действия для вас. эта коллекция FormCollection содержит ВЕСЬ материал обратной передачи. вы можете легко сделать это:public ActionResult AddNews(FormCollection col, News news){
хотя это не решает вашу проблему. и когда вам не нужно ничего, кроме новостей, вы, вероятно, можете удалитьFormcollection
3. При использовании MVC3 вы не можете использовать
FormCollection
при использовании[AllowHtml]
. затем вы должны использовать свойNews news
Ответ №1:
Вам нужно поместить это поверх вашего [HttpPost]
метода действия
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(FormCollection collection) {
.....
}
Если вы используете MVC3, то вам не следует использовать, [ValidateInput(false)]
но используйте [AllowHtml]
, что объясняется здесь: http://dailydotnettips.com/2011/08/24/how-to-allow-user-to-input-html-in-asp-net-mvc /
также: попробуйте поместить [ValidateInput(false)]
над вашим [HttpPost]
, а не под, насколько я помню, они выполняются сверху вниз.
Комментарии:
1. я добавил [ValidateInput(false)], имеет ли значение, что у меня нет FormCollection в качестве параметра?
2. можете ли вы отредактировать свой пост с помощью метода whole action? попробуйте добавить FormCollection. это может просто помочь.
3. попробуйте поместить
[AllowHtml]
поверх вашегоNewsBody
. какую версию MVC вы используете? вам нужно поместить в[AllowHtml]
свойство то,NewsBody
где вы определяете свой новостной объект. вы не забыли выполнить сборку?4. попытался переместить его выше, не сработало. Это MVC2, извините, должен был сказать, что
5. я вижу это в третий раз link…it это 404
Ответ №2:
В MVC 3 добавьте [AllowHtml]
к свойству в модели представления, которое вы не хотите проверять.
Ответ №3:
В файле web.config внутри тегов вставьте элемент HttpRuntime с атрибутом requestValidationMode=»2.0″. Также добавьте атрибут ValidateRequest=»false» в элемент pages.
Пример:
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Ответ №4:
Общее эмпирическое правило заключается в том, что вы получите эту ошибку при отправке в метод action, который не допускает потенциально опасные значения формы. Если вы примете это во внимание наряду с тем фактом, что вы, очевидно, решили разрешить такие значения для данного метода действия, вы должны сделать вывод, что вы каким-то образом отправляете в другой метод действия.
Можете ли вы попробовать опубликовать стандартную строку (например, «hello») без WMD и проверить, достигнуты ли ваши точки останова в выбранном методе действия?
Ответ №5:
используйте [ValidateInput(false)] для устранения ошибок такого типа
Это происходит потому, что пользовательский ввод содержит различные html-теги.Таким образом, архитектура MVC3 не имеет разрешения для такого типа ввода.
Мы можем устранить эту ошибку, написав [ValidateInput(false)] над результатом действия или там, где мы отправляем нашу форму. Эта команда отключит проверку формы для html-тегов.
Ответ №6:
Я пытался найти решение этой проблемы целый день.
Отключение проверки не было вариантом.
Добавление AllowHTML также не было вариантом, поскольку по спецификации msdn:
AllowHtmlAttribute позволяет запросу включать HTML-разметку во время привязки модели, пропуская проверку запроса для свойства. источник
Кроме того, в проекте существует множество свойств со строковыми атрибутами, которые должны быть проверены, если для проверки по умолчанию установлено значение false.
Решение:
Я создал класс CustomRequestValidation:
public class CustomRequestValidation : System.Web.Util.RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
validationFailureIndex = -1;
if (requestValidationSource == RequestValidationSource.RawUrl)
return true;
if (requestValidationSource == RequestValidationSource.Form)
{
var isValid = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
if (!isValid)
{
validationFailureIndex = -1;
return true;
}
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
что он делает, так это то, что он просто пропускает проверку запроса с целью достижения состояния модели.
Затем я переопределил связующее по умолчанию для модели:
public class CustomModelBinder : DefaultModelBinder
{
protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
if (value != null)
{
if (propertyDescriptor.PropertyType == typeof(string))
{
string val = value.ToString();
int validationIndex;
var isValid = new System.Web.Util.RequestValidator().InvokeIsValidRequestString(controllerContext.HttpContext.ApplicationInstance.Context, val, RequestValidationSource.Form, null, out validationIndex);
if (!isValid amp;amp; !propertyDescriptor.Attributes.OfType<AllowHtmlAttribute>().IsAny())
{
var key = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
bindingContext.ModelState.AddModelError(key, ErrorConstants.SpecialCharacters);
}
}
}
return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
}
}
Теперь здесь мы выполняем всю проверку. В model binder я вызываю значение по умолчанию .Net использует метод validrequeststring вместе с проверкой, был ли установлен AllowHTML, и я соответствующим образом устанавливаю состояние модели. Это дает мне контроль над данными, и я могу вернуться на страницу и заполнить форму ранее введенными данными без запуска вставленных скриптов. Я использую строго типизированные модели.