2012-08-17 28 views
6

Estoy construyendo una aplicación web MVC3 y estoy usando knockoutjs. Hay dos vistas en la aplicación. SetUpNewCompany y ManageAccount. Para configurar una nueva compañía, el usuario primero ingresa el número de cuenta y hace clic en buscar. Si el número de cuenta ya existe, el usuario puede hacer clic en un botón para ir a la vista Administrar cuenta. En SetUpNewCompanyController, redirijo utilizando el método RedirectToAction. Sin embargo, cuando se ejecuta la acción de Index2 en ManageAccount, la vista no se muestra. Si escribo la URL completa, se muestra la vista.MVC RedirectToAction a través de ajax llamada jQuery en knockoutjs no funciona

SetUpNewCompanyController.cs

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

Este arriba se llama por la función a continuación cuando se hace clic en un botón

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

La URL que se genera es

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

La ventana de la consola de Firebug muestra

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

Además, ¿cómo puedo obtener la URL a continuación en lugar de la que tiene la cadena de consulta

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

Respuesta

17

Dado que utiliza AJAX para llamar al método RedirectToManageAccount acción , usted es responsable de manejar su respuesta usted mismo y como su función de controlador success está vacía, está haciendo caso omiso de lo que llegue como respuesta.

Si desea forzar una redirección desde dentro del manejador de respuesta AJAX, sugiero

  1. La modificación de su método de acción de la siguiente manera

    [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. Actualización de la llamada AJAX de esta manera

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

En cuanto a su segunda pregunta:

Además, ¿cómo puedo obtener la URL a continuación en lugar de la que tiene la cadena de consulta http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f

Sólo hay que definir una entrada vía apropiada para esta URL en su RegisterRoutes() función:

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

EDITAR: A medida que su llamada AJAX sólo sirve para llamar a un método de acción que causa una redirección, puede simplificar en un siguiente manera, proporcionada en este punto (en el lado del cliente) conocer la companyId ya:

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

donde solía este método de extensión

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

¿hay otra manera para redirigir a la ManageAccount/Index2 también he añadido la ruta como usted sugiere, pero todavía tiene el? CompanyID = xxxxx en la URL – shresthaal

+0

depende de la situación específica , De Verdad. Actualicé mi respuesta con una posible simplificación del proceso de redireccionamiento. En cuanto a la ruta: ¿estás seguro de que no la agregaste después de una regla más general? – twoflower

+0

cambié el companyid a id y usé la ruta de enrutamiento predeterminada para eliminar la cadena de consulta – shresthaal

Cuestiones relacionadas