2012-08-17 8 views
6

Sto creando un'applicazione Web MVC3 e sto utilizzando knockoutjs. Ci sono due viste nell'applicazione. SetUpNewCompany e ManageAccount. Per impostare una nuova società, l'utente inserisce prima il numero dell'account e fa clic su Cerca. Se il numero di conto esiste già, l'utente può fare clic su un pulsante per andare alla vista ManageAccount. In SetUpNewCompanyController reindirizzo utilizzando il metodo RedirectToAction. Tuttavia, quando viene eseguita l'azione Index2 in ManageAccount, la vista non viene visualizzata. Se scrivo l'URL completo, viene visualizzata la vista.MVC RedirectToAction tramite ajax La chiamata jQuery in knockoutjs non funziona

SetUpNewCompanyController.cs

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

Questo sopra è chiamato dalla funzione di seguito quando viene cliccato un pulsante

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); 
    } 

L'URL che viene generata viene

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

La finestra della console di Firebug mostra

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

Inoltre, come faccio ad ottenere l'URL di seguito, invece di quello con querystring

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

risposta

17

Dal momento che si utilizza AJAX per chiamare il metodo RedirectToManageAccount azione , sei responsabile della gestione della risposta da te stesso e poiché la tua funzione di gestore di success è vuota, stai effettivamente ignorando qualsiasi cosa arrivi come risposta.

Se si vuole forzare un reindirizzamento da all'interno del gestore risposta AJAX, suggerisco

  1. Modificare il metodo di azione come segue

    [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. Aggiornamento chiamata AJAX in questo modo

    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() { 
          } 
        }); 
    } 
    

Per quanto riguarda la seconda domanda:

Inoltre, come faccio a ottenere l'URL di seguito, invece di quello con querystring http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f

Basta definire una voce via appropriata per questo URL nel vostro RegisterRoutes() funzione:

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

EDIT: Come la chiamata AJAX serve solo per chiamare un metodo di azione che provoca un reindirizzamento, è possibile semplificare in un modo seguente, è fornito in questo punto (sul lato client) conoscere la companyId già:

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

dove ho usato questo metodo di estensione

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

c'è un altro modo per reindirizzare al ManageAccount/Indice2 anche ho aggiunto il percorso come lei ha suggerito, ma ho ancora ottenuto il? CompanyID = xxxxx nell'URL – shresthaal

+0

dipende dalla situazione specifica , veramente. Ho aggiornato la mia risposta con una possibile semplificazione del processo di reindirizzamento. Per quanto riguarda il percorso: sei sicuro di non averlo aggiunto __after__ qualche regola più generale? – twoflower

+0

ho cambiato la companyid in id e ho utilizzato il percorso di instradamento predefinito per rimuovere la query querystring – shresthaal

Problemi correlati