2012-08-17 11 views
6

Buduję aplikację internetową MVC3 i używam knockoutjs. W aplikacji są dwa widoki. SetUpNewCompany i ManageAccount. Aby założyć nową firmę, użytkownik najpierw wprowadza numer konta i przeszukuje kliknięcia. Jeśli numer konta już istnieje, użytkownik może kliknąć przycisk, aby przejść do widoku ManageAccount. W SetUpNewCompanyController przekierowuję za pomocą metody RedirectToAction. Jednak po wykonaniu akcji Index2 w ManageAccount widok nie jest wyświetlany. Jeśli wpiszesz pełny adres URL, wyświetli się widok.MVC RedirectToAction przez ajax jQuery call w knockoutjs nie działa

SetUpNewCompanyController.cs

[HttpPost] 
public RedirectToRouteResult RedirectToManageAccount(string accountNumber) 
{ 
     return RedirectToAction("Index2", new RouteValueDictionary(new {controller= 
      "ManageAccount", companyId = "7e96b930-a786-44dd-8576-052ce608e38f" })); 
} 

To powyżej jest wywoływana przez funkcję poniżej, gdy kliknięciu przycisku

self.redirectToManageAccount = function() { 
     var accountNumber = "7e96b930-a786-44dd-8576-052ce608e38f"; 
     $.ajax({ 
      type: "POST", 
      url: "/SetUpNewCompany/RedirectToManageAccount", 
      data: { accountNumber: accountNumber }, 
      success: function (data) { 
      }, 
      error: function() { 
      } 
     }); 
} 

ManageAccountController.cs

public ActionResult Index2(String companyId) 
    { 
     var viewModel = new Models.Index(); 

     List<String> compList = new List<String>(); 
     compList.Add("MyCompany"); 

     List<String> usersList = new List<String>(); 
     usersList.Add("User1"); 

     viewModel.Users = usersList; 
     viewModel.Companies = compList; 
     viewModel.CompanyId = companyId; 
     viewModel.Role = "Role1"; 

     return View("ManageAccount",viewModel); 
    } 

URL, który jest generowany

http://localhost:53897/ManageAccount/Index2?companyId=7e96b930-a786-44dd-8576- 
052ce608e38f 

oknie konsoli w Firebug pokazuje

GET http://localhost:53897/ManageAccount/Index2?companyId=7e96b930-a786-44dd-8576- 
052ce608e38f 200 OK and the spinner keeps spinng 

Również, w jaki sposób mogę uzyskać adres URL poniżej zamiast jednego z kwerendy

http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f 

Odpowiedz

17

Ponieważ używasz AJAX wywołać metodę RedirectToManageAccount działania , jesteś odpowiedzialny za samodzielną obsługę odpowiedzi, a ponieważ funkcja handlowa success jest pusta, skutecznie ignorujesz to, co nadejdzie jako odpowiedź.

Jeśli chcesz wymusić przekierowanie z poziomu obsługi odpowiedzi AJAX, proponuję

  1. Modyfikacja metody działania w następujący sposób

    [HttpPost] 
    public ActionResult RedirectToManageAccount(string accountNumber) 
    { 
        var redirectUrl = new UrlHelper(Request.RequestContext).Action("Index2", "ManageAccount", new { companyId = "7e96b930-a786-44dd-8576-052ce608e38f" }); 
        return Json(new { Url = redirectUrl }); 
    } 
    
  2. Aktualizacja wywołanie AJAX w ten sposób

    self.redirectToManageAccount = function() { 
        var accountNumber = "7e96b930-a786-44dd-8576-052ce608e38f"; 
        $.ajax({ type: "POST", 
          url: "/SetUpNewCompany/RedirectToManageAccount", 
          data: { accountNumber: accountNumber }, 
          dataType: 'json', 
          success: function (response) { 
           window.location.href = response.Url; 
          }, 
          error: function() { 
          } 
        }); 
    } 
    

Co do drugiego pytania:

Również, w jaki sposób mogę uzyskać adres URL poniżej zamiast jednego z kwerendy http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f

Trzeba tylko określić odpowiedni wpis o trasach obsługiwanych przez ten URL w RegisterRoutes() funkcja:

routes.MapRoute(null, 
       "ManageAccount/Index2/{companyId}", 
       new { controller = "ManageAccount", 
         action = "Index2" }        
); 

EDIT: Jak rozmowa AJAX służy jedynie wywołać metodę działania, który powoduje przekierowanie, można uprościć go w następujący sposób, o ile cię w tym momencie (po stronie klienta) wie companyId już:

self.redirectToManageAccount = function() { 
    var companyId = "12345"; 
    window.location.href = '@(Html.ActionUri("Index2", "ManageAccount"))?companyId=' + companyId; 
} 

gdzie użyłem tej metody rozszerzenie

public static string ActionUri(this HtmlHelper html, string action, string controller) 
{ 
    return new UrlHelper(html.ViewContext.RequestContext).Action(action, controller); 
} 
+0

Czy istnieje inny sposób na przekierowanie do ManageAccount/Index2 również dodałem trasę jak zasugerował ale ja wciąż mam? companyId = xxxxx w adresie URL – shresthaal

+0

to zależy od konkretnego scenariusza naprawdę. Zaktualizowałem swoją odpowiedź jednym z możliwych uproszczeń procesu przekierowania. Jeśli chodzi o trasę: czy na pewno nie dodałeś go __after__ jakiejś bardziej ogólnej reguły? – twoflower

+0

Zmieniłem identyfikator firmy na id i użyłem domyślnej trasy routingu, aby usunąć zapytanie – shresthaal