2015-05-05 6 views
1

У меня довольно простой single-page application, который использует AJAX для загрузки и замены содержимого страницы. Приложение должно позволить пользователю добавлять телефонные номера клиенту. После того, как пользователь загрузит view, чтобы добавить новый номер телефона, нажав на странице Ajax.ActionLink на странице клиентов, он может отправить форму AJAX с номером, который будет добавлен, и если значение представляет собой номер, он должен быть перенаправлен обратно на страницу клиентов. Вот где я застрял, как мне вернуть результат другого action? Кажется, что я не могу использовать RedirectToAction, так как он возвращает 302, и браузер инициирует запрос GET, который не разрешает глагол в моей ситуации, в результате браузер возвращает 404.RedirectToAction в одностраничном приложении

Итак, у меня есть два controllers, PhoneBookController и CustomersController. нагрузки пользователя Customers/Detailsview и нажимает на Ajax.ActionLink, который называют PhoneBook/Addaction, это action возвращают view с AJAX формой, которая представляется на PhoneBook/Createaction.

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Phone ph, string Caller) 
{ 
    if (ModelState.IsValid) 
    { 
     ph.Active = true; 
     db.PhoneBook.Add(ph); 
     db.SaveChanges(); 
/*->*/ return RedirectToAction("Details", "Customers", new { Id = ph.CustomerId }); //what should be used instead? 
    } 

    return PartialView("Add", ph); 
} 

Как обычно выполняются такие задачи?

ответ

1

Как вы используете Ajax, вы можете вернуть URL из ваших действий и он перенаправляется в JavaScript:

контроллер

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Phone ph, string Caller) 
{ 
    if (ModelState.IsValid) 
    { 
     ph.Active = true; 
     db.PhoneBook.Add(ph); 
     db.SaveChanges(); 
    return Json(new { success = true, redirecturl = Url.Action("RedirectedAction") }); 
} 

Когда вы определяете ActionLink, указать обработчик успеха:

new AjaxOptions 
{ 
    OnSuccess = "onSuccess" 
} 

JavaScript

function onSuccess(result) { 
    if (result.success == true) 
    { 
     window.location = result.redirecturl; 
    } 
} 
+0

Ну, это не должно быть 'window.location', но у меня есть идея. Единственная проблема здесь в том, что если «ModelState.IsValid» я собираюсь отправить «JSON», а если нет, то тот же вид должен быть загружен с ошибками проверки. и как я могу понять, какой из них был возвращен? 'Ajax.ActionLink (« Добавить новый номер »,« », новый AjaxOptions {HttpMethod =" POST ", UpdateTargetId =" main-content ", Url = Url.Action (" Добавить "," Телефонная книга ", новый {CustomerId = Model .BaseCustomer.Id})}) ', поэтому я могу добавить let say' OnSuccess = "(function (response) {...}) (data)" ', но как узнать, что ответ имеет представление или URL? – Jyrkka

+0

@Jyrkka Я бы просто передал данные json и обновил интерфейс. Вы можете выводить ошибки проверки таким образом: http://stackoverflow.com/questions/28987752/jquery-post-and-unobtrusive-ajax-validation-not-working-mvc-4/28989183#28989183 – hutchonoid

+0

Кажется, что мне нужно Ваша помощь здесь также, очевидно, '$ .validator.unobtrusive.parse ($ form)' не может использоваться, поскольку $ form не определен. если я перехожу в 'document' вместо' $ form', сообщения об ошибках отображаются только после второго нажатия кнопки отправки? – Jyrkka

Смежные вопросы