#ajax #asp.net-mvc #asp.net-mvc-4
#ajax #asp.net-mvc #asp.net-mvc-4
Вопрос:
У меня есть этот код
@using (Ajax.BeginForm("LoadFilter", "Contact", new { filterType = (int)FilterContactBy.Name }, new AjaxOptions { OnBegin = "ShowProgrees", OnSuccess = "HideProgress" }))
{
@Html.TextBoxFor(m => m.ContactFilter.FilterValue, new { placeholder = "Enter a name" })
<input type="submit" class="link submit green" value="Add Filter" />
}
Как совершенно очевидно, метод ShowProgress
and HideProgress
ничего не делает, кроме отображения и скрытия GIF-файла загрузчика.
Метод в серверной части является
[HttpPost]
public ActionResult LoadFilter(ContactListModel filter, int filterType=0, Boolean isAllFilterApply=true)
{
if (filter != null)
{
// process here
}
}
Он отлично работает, если я что-либо ввожу, например
hi
test
me amp; you
contact #1
contact #1 and me
НО
Когда я вхожу amp;#
вместе в любом из, возникает ошибка. Загрузчик gif просто продолжает двигаться, и код на контроллере никогда не отображается.
Кроме того, в консоли Chrome это отображается 500 Internal Server Error
(как и Firefox!).
Мое решение
Я пытался escape
и enocodeURIComponent
, но это не сработало. Вот метод, который я пробовал
$.ajaxPrefilter(function(o, org, xhr) {
if (org.url.indexOf('/Contact/LoadFilter?filterType=') > -1) {
// console.log(org.data[0].value);
org.data[0].value = encodeURIComponent(org.data[0].value);
// console.log(org.data[0].value);
}
});
Вывод (в консоли)
amp;#
%26%23
Когда вместо encodeURIComponent
я использовал escape
, результат был таким же
amp;#
%26%23
Но он по-прежнему не попадает в метод на контроллере. Может кто-нибудь, пожалуйста, помочь мне найти решение и, что более важно, скажите мне, почему это происходит в первую очередь?
ps
Пожалуйста, не спрашивайте меня, какой смысл вводить amp;#
в фильтр контактов или удалять их и сообщать клиенту, что это недопустимый ввод. Я не могу этого сделать, поэтому, пожалуйста, не советуйте этого.
Обновить
Кто-нибудь вообще читает это полностью? Я не спрашиваю, как я могу декодировать. нет. Пожалуйста, прочитайте полный вопрос, прежде чем помечать его как дубликат или закрывать.
Ответ №1:
Хорошо, я понял это.
Я создал Application_BeginRequest
в Global.asax
коде, подобном этому..
protected void Application_BeginRequest(Object sender, EventArgs e)
{
var httpApp = (HttpApplication)sender;
Debug.Write(httpApp);
}
Я установил точку останова httpApp
, а затем в watch
окне проверил httpApp.Request
и обнаружил, что она была там. Он сказал (something I don't remember right now) threw an exception of type 'System.Web.HttpRequestValidationException'
.
Итак, я понял, что ошибка была из-за этого, поэтому в методе LoadFilter
я просто добавил атрибут ValidateInput(false)
, и он работает
[HttpPost]
[ValidateInput(false)]
public ActionResult LoadFilter(ContactListModel filter, int filterType=0, Boolean isAllFilterApply=true)
{
// process here
}
Тем не менее, мне нужно проверить здесь sql-инъекцию, потому что мы создаем динамический запрос на основе полученных входных данных.
Ответ №2:
Использовать
HttpUtility.UrlDecode("url")
Комментарии:
1. Вы прочитали вопрос? Это даже не влияет на действие на странице контроллера. Я знаю, что могу использовать
UrlDecode
, но для этого сначала нужно выполнить действие правильно? И это был вопрос.