2011-03-25 17 views
5

tengo problemas para resolver un error 404:HTTP 404 con Ajax.ActionLink

ruta por defecto en Global.asax.cs:

routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

VideoController.cs:

[HttpPost] 
public ActionResult Save(int id) 
{ 
    try 
    { 
    return Json(new 
    { 
     ID = "0" 
    }); 
    } 
    catch 
    { 
    return new HttpStatusCodeResult(418, "I'm a teapot"); 
    } 
} 

ActionLink en mi opinión, Create.cshtml:

@Ajax.ActionLink("GoSave", "Save", "Video", new { id = 1 }, 
     new AjaxOptions { OnFailure = "Error", OnSuccess = "Saved", 
          HttpMethod = "POST" }) 

The url de la ActionLink se representa como se esperaba:/vídeo/Guardar/1

Cuando hago clic en el enlace me sale un 404.

¿Qué es lo que estoy viendo no?

Respuesta

11

apuesto se echa en falta una inclusión script:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 

Esto le discretamente AJAXify el resultado generado Ajax.ActionLink y realizar una solicitud POST en lugar del predeterminado conseguir uno. Obtiene 404 porque no ha incluido esta secuencia de comandos y, por lo tanto, se envía una solicitud GET y no hay ninguna acción Guardar en controlador de video capaz de recibir una solicitud GET.

Si ha usado FireBug inmediatamente habría visto esto: que el navegador simplemente está redireccionando y enviando una solicitud GET en lugar de la solicitud POST Ajax esperada.

+0

TNX de nuevo! ;) Firebug no es compatible con FF4, aún. –

+0

@Andrew Flierman, luego usa una versión anterior. Quiero decir, desarrollar una aplicación web sin FireBug es como intentar jugar fútbol sin balón (sin siquiera pensar en una aplicación web habilitada para AJAX). En ambos casos, el resultado será el mismo => fracaso para lograr el objetivo inicial :-) –

+0

No es necesario utilizar versiones anteriores: actualizadas mientras hablamos. –

1

Agregando a la respuesta de Darin ...

Añadir este paquete NuGet, que "establece discretamente jQuery Ajax".

enter image description here

Todo este paquete hace es instalar los scripts necesarios.

enter image description here

A continuación, haga lo que dice Darin o, equivalentemente, añadir:

@Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js") 

a _Layout.cshtml

Cuestiones relacionadas