2011-09-01 18 views
6

Si trato de devolver algo de JavaScript de mi controlador de la siguiente manera:ASP.NET MVC - Volviendo JavaScriptResult no funciona

public ActionResult DoSomething() 
{  
    return JavaScript("alert('Hello world!');");    
} 

que no ven el mensaje de alerta en el navegador, pero conseguir una transferencia directa solicitud de un script .js desde la página nombrada como la acción (register.js en mi caso). ¿Qué está mal?

+0

¿Cómo llamas tu acción? Además, tenga en cuenta que esto generalmente se considera un [anti-patrón] (http://devlicio.us/blogs/billy_mccafferty/archive/2009/02/07/beware-of-asp-net-mvc-javascriptresult.aspx) . – R0MANARMY

Respuesta

2

Pruebe el siguiente.

public ActionResult DoSomething(){ 

return Json(new {isok=true, message="Your Message", data=...}); 

//True/False Json Return 
//return UserObj == null ? 
//Json(true, JsonRequestBehavior.AllowGet) : 
//Json(string.Format("YourObject '{0}' to String", YourObject), 
//JsonRequestBehavior.AllowGet); 

} 

//view 
$.ajax 
{ 

//code 
success :function(returnvalue) 
{ 

if(!returnvalue.isok) 
{ 
window.alert("Error:" + returnvalue.message); 
} 
else 
{ 
//do the stuff with returnvalue.data 
} 

} 
7

no volvería Javascript, volvería Content, a continuación, en la página, me gustaría convertir ese contenido a una alerta:

public ActionResult DoSomething() 
{  
    return Content("Hello world!");    
} 

$.ajax({ 
    url: "/Action/DoSomething/", 
    type: "POST", 
    success: editSuccess, 
    error: editFailure 
}); 

function editSuccess(data) { 
    alert(data); 
} 
+1

Me parece que es anti-patrón, pero a veces necesito llamar a una función javascript definida de mi controlador (la alerta(); era un ejemplo). Gracias. – User907863

12

He tenido un problema similar con el JavaScript especificado no ejecutar al devolver el resultado como un JavaScriptResult. En mi caso, el contenido de JavaScript se representaba como texto dentro de las etiquetas <pre>.

La solución es devolver el JavaScript como ContentResult, utilizando el método Content(). Así que intente:

public ActionResult DoSomething() 
{  
    return Content("<script language='javascript' type='text/javascript'>alert('Hello world!');</script>");    
} 

Encontré la respuesta en los foros de ASP.NET. Echar un vistazo a la respuesta de Bruce en el siguiente enlace para una explicación más completa de por qué se hace de esta manera:

Return JavascriptResult Not Working

+0

gracias! esto funciona al invocar ActionMethod directamente desde la barra de direcciones del navegador, que es lo que necesitaba hacer. –

3

Si necesita devolver un código JS usando JavaScriptResult, tenga en cuenta que su acción debe ser llamado a través de la llamada ajax. Llamar a esta acción a través de Html.Actionlink u otros controles directamente, resulta en mostrar el texto del script en lugar de ejecutar el script. Así que hay que añadir un código js en su opinión:

<script type="text/javascript"> 
    $(function() { 
      $('#myButtonId').click(function() { 
       $.getScript("/MyController/DoSomething"); 
      }); 
    }); 
</script> 

y su acción en myController:

public ActionResult DoSomething() 
{  
    return JavaScript("alert('Hello world!');");    
} 
1

Cuando llame a su acción desde el punto de vista, asegúrese de que utiliza @Ajax.ActionLink en lugar de la @Html.ActionLink método de ayuda. El JavaScript se procesará correctamente y aparecerá su alerta.

Cuestiones relacionadas