Не удается передать амперсанд и хэш-знак в MVC

#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 , но для этого сначала нужно выполнить действие правильно? И это был вопрос.