2014-11-04 5 views
1

Я изо всех сил стараюсь достичь следующего: у меня есть страница, на которой пользователь регистрирует вызов, пользователю нужно вводить различные поля и выбирать из нескольких выпадающих списков, тогда мне нужно отправить эти данные (либо через JQuery, либо через контроллер) на другую страницу, где пользователь может просматривать введенные данные и принимать решение об их фиксации.MVC Jquery/Controller Post Redirect

Я возвращаюсь назад и четвертый целую вечность, пытаясь выяснить, как отправлять данные из моего cshtml на мой контроллер, а затем перенаправлять на другую страницу с сохранением этих данных.

Я попытался перенаправить через JQuery и/или контроллер и просто не могу заставить работать тот или иной.

код извлекает ниже:

cshtml:

 $.ajax({ 
      url: dir + '/Submit/', 
      async: true, 
      type: 'POST', 
      data: JSON.stringify(callData), 
      contentType: 'application/json; charset=utf-8', 
      complete: function() { }, 
      success: function (data) { 
      } 
     }) 

Контроллер:

[HttpPost] 
    public ActionResult Submit(SupportCallModel callData) 
    { 
     SupportCallModel newData = new SupportCallModel(); 

     newData.SupportCallID = 1; 
     newData.CallTypeID = callData.CallTypeID; 
     newData.TroubleShooting = callData.TroubleShooting; 
     newData.EmailRequest = callData.EmailRequest; 
     newData.MailDate = callData.MailDate; 
     newData.FSEOnSite = callData.FSEOnSite; 
     newData.FSEEmployeeID = callData.FSEEmployeeID; 
     newData.CallCategory = callData.CallCategory; 
     newData.CallType = callData.CallType; 
     newData.CallItem = callData.CallItem; 
     newData.Summary = callData.Summary; 
     newData.Description = callData.Description; 
     newData.ExternalReference = callData.ExternalReference; 
     newData.CallStatusID = callData.CallStatusID; 
     newData.CallPriorityID = callData.CallPriorityID; 
     newData.CallCoEmployeeID = callData.CallCoEmployeeID; 

     return RedirectToAction("Verify", newData); 
    } 

    public ActionResult Verify(SupportCallModel postData) 
    { 
     return View(postData); 
    } 
+0

Вы просмотрели свои инструменты для разработчиков или с помощью Fiddler, чтобы увидеть POST, и если есть ошибка? –

+0

Почему вы строкой 'JSON.stringify (callData)'? Я думаю, что привязка модели MVC отлично работает. –

+0

В настоящее время не принимается никаких ошибок. Контроллер просто не перенаправляется на страницу «Проверить». Если я добавлю что-то вроде «window.location.href =» /SupportCall/Verify/callData?"+JSON.stringify(callData) «к успеху поста AJAX, он перенаправляет, но без данных – Stuart

ответ

0

Использование Ajax не имеет смысла, так как Ajax звонки остаются на той же странице (return RedirectToAction("Verify", newData); игнорируется). Вы можете просто сделать обычный подарок. Предполагая, что ваш рендеринг будет иметь все необходимые входные данные для SupportCallModel, тогда он будет отправлять сообщения назад. Я бы порекомендовал вас включить

[HttpPost] 
public ActionResult Submit(SupportCallModel callData) 
{ 
    if (!ModelState.IsValid) 
    { 
    return View(callData); 
    } 
    ... 

наверху метода в случае, если модель содержит ошибки проверки.

Вы затем создать новый экземпляр SupportCallModel на основе свойств callData, который также кажется бессмысленным (почему не просто передать callData вместо newData?)

Если SupportCallModel содержит только свойства, которые являются типами значений, то вы можете использовать return RedirectToAction("Verify", newData); или return RedirectToAction("Verify", callData);. Внутренне a RouteValueDictionary создается на основе имени и значения каждого свойства и postData будет правильно привязан в методе Verify(). Если, однако, какие-либо из свойств являются сложными типами или наборами, то привязка не будет выполняться для этих свойств. В этом случае вам необходимо сохранить модель, чтобы ее можно было найти в методе Verify. Моя рекомендация состояла бы в том, чтобы сохранить базу данных (либо отдельную таблицу, либо существующую таблицу, которая включает в себя поле, указывающее состояние ожидания), но вы можете использовать Session или TempData (в сочетании с .Peek, чтобы он не потерялся, если пользователь попадает на обновление кнопка).

Я не уверен, что именно метод Verify GET является рендерингом, но если он не включает элементы управления для всех свойств, тогда кнопка отправки Verify должна будет отправить обратно некоторое значение ID, которое позволит вам снова получить модель из базы данных или сеанса и, наконец, сохранить его в базе данных.

+0

Что я сделал, чтобы заставить его работать, добавляет список в сеанс в ActionResult Submit(), перейдя на страницу Verify в Success от AJAX, а затем извлекая список из сеанса – Stuart

0

В свой адрес пост ...

$.ajax({ 
     url: '@Url.Action("Submit","{ControllerName}")', 
     async: true, 
     type: 'POST', 
     data: JSON.stringify(callData), 
     contentType: 'application/json; charset=utf-8', 
     complete: function() { }, 
     success: function (data) { 
       window.location.href = '@Url.Action("Verify","{ControllerName}", Model);' 
     } 
    }) 
+0

Такая же проблема сохраняется. Когда он попадает в «return RedirectToAction (« Проверить », newData); Вызывается «Проверить» ActionResult, но страница не перенаправляется – Stuart

+0

Я даже не понимаю, почему вы используете jquery для этого вообще, это добавляет слой косвенности ко всему, что вы делаете, и делаете очень простой код не работают должным образом. –

+0

Некоторая логика, используемая для получения данных из выпадающих списков, выполняется через JQuery. Затем он передается объекту 'callData', с которым выполняется некоторая проверка. Не уверен в другом способе передачи данных обратно контроллеру. – Stuart

0

Это не работает, потому что вы» перенаправление на сер ver, когда вы делаете вызов через AJAX. Ваши переадресации должны выполняться на стороне клиента, так как вы вызываете ActionResult в нетрадиционном смысле (AJAX).

Вы можете удалить return RedirectToAction("Verify", newData); со своего результата действия, так как он ничего не сделает. Вероятно, вы можете просто вернуть то, что указывает, был ли вызов действительным или нет.

Чтобы ваши данные сохранялись на другой странице, вам необходимо сохранить данные в таблице temp в БД, чтобы вы могли показать ее при перенаправлении.

$.ajax({ 
    url: dir + '/Submit/', 
    async: true, 
    type: 'POST', 
    data: JSON.stringify(callData), 
    contentType: 'application/json; charset=utf-8', 
    complete: function() { 
    }, 
    success: function (data) { 
     if (data && data.isValid) { 
      // Grab the tempId that was saved temporarily for verification. 
      var tempId = data.tempId; 

      // Perform redirect 
      window.location = dir + '/Verify/' + tempId; 
     } 
    } 
}); 
+0

Как сохранить данные на новой странице? Поскольку я еще не фиксирую данные, на странице проверки будет сохранена функция сохранения данных в db. – Stuart

+0

Вам нужно будет сохранить его в БД, если вы хотите просмотреть данные на другой странице. Есть ли причина для этого? Вы не можете проверить на одной странице? –

+0

Это часть дизайна, который в настоящее время выбран, пользователь вводит все данные, а затем просматривает его на другом экране перед его выполнением, тогда необходимо будет сгенерировать и отобразить ссылочный номер пользователю, а затем вернуться к панели управления. Можно ли добавить данные в переменную сеанса, которая может быть передана на другой экран? – Stuart

0

Вы можете смоделировать все это без использования Ajax, используя стандартные сообщения формы для контроллеров MVC достаточно просто.

Если предположить, что поток выглядит примерно так:

Submit -> Verify process flow

Сделать Отправить POST возвращает представление, содержащее данные, отправленные в модели. Если эти данные могут быть проверены, сделайте представление, позволяющее просматривать данные в этой форме для подтверждения действия контроллера.

В этом дизайне данные полностью преходящи, данные, отправленные в полезной нагрузке формы HTTP на начальном посту, затем возвращаются как форма в возвращаемом HTML. Затем эти данные отправляются в действие Verify.

Чтобы сделать это в вашем случае я думаю, что это может быть не так просто, как назвав Submit с Post глаголом как ни один Ajax вызов и вносимых в нее изменений, так что возвратная линия выглядит return View("Verify", newData);

Вы также, очевидно, необходимо сделать что-то еще с помощью Verify, чтобы что-то сделать в этом методе действий.