2010-04-25 486 views
12

¿Puedo llamar a la función javascript desde Acción del controlador MVC (no desde la página de visualización) y obtener el valor de retorno? ¿Cómo?Llamar javascript desde la acción del controlador MVC


Necesito hacer petición al servidor de código (Cs) usando javascript como aquí (pero esta es la página aspx)

function getInitData() { 
var code; code = 'return {' ; 
code += 'me: API.getProfiles({uids: API.getVariable({key: 1280}), fields: "photo"})[0]'; 
code += '};' 
VK.Api.call('execute', { 'code': code }, onGetInitData); 
} 
+6

Esto es completamente imposible. – SLaks

Respuesta

11

Puede invocar una acción de controlador desde una función de JavaScript pero no viceversa. ¿Cómo sabría el servidor a qué cliente dirigirse? El servidor simplemente responde a las solicitudes.

Un ejemplo de invocar una acción de controlador desde JavaScript (utilizando la biblioteca jQuery JavaScript) en la respuesta enviada al cliente.

$.ajax({ 
      type: "POST", 
      url: "/Controller/Action", // the URL of the controller action method 
      data: null, // optional data 
      success: function(result) { 
       // do something with result 
      },     
      error : function(req, status, error) { 
       // do something with error 
      } 
     }); 
+0

Necesito hacer una solicitud al servidor desde el código usando javascript como aquí: función getInitData() { código var; código = 'return {'; código + = 'me: API.getProfiles ({uids: API.getVariable ({clave: 1280}), campos: "foto"}) [0]'; code + = '};'; VK.Api.call ('execute', {'code': code}, onGetInitData); } –

+0

Hola Russ, estoy teniendo un gran número de CommandButtons (vinculantes para la misma acción) en una lista de 20 elementos. Por lo tanto, estoy tratando de reducir el no de CommandButtons. Estaba buscando formas de llamar a los métodos de acción en las clases de controlador a través de javascript y simplemente me encontré con esto. ¿Debo usar su tecnología dada para reducir el estado llamando a métodos de acción como este desde JS en lugar de con múltiples enfoques CommandButtons? Gracias ! –

+0

@Marcos - No estoy seguro de entender completamente cuál es su pregunta - Recomiendo abrir una nueva pregunta con los detalles y ver cómo la comunidad stackoverflow puede ayudar –

0

La forma/norma habitual en MVC es que debe poner/llamar a su pantalla completa, UI, CSS y Javascript en la vista, sin embargo, no hay regla para eso, puede llamarlo también en el controlador si logra hacerlo (algo que no veo) Posibilidad de).

0

Como las acciones de su controlador se ejecutan en el servidor y JavaScript (normalmente) se ejecuta en el cliente (navegador), esto no tiene sentido. Si necesita que se realice alguna acción de forma predeterminada una vez que la página se carga en el navegador, puede usar el controlador de eventos document.OnLoad de JavaScript.

1

Hay formas en que puede imitar esto haciendo que su controlador devuelva un dato, que luego su vista puede traducir en una llamada de JavaScript.

Hacemos algo como esto para permitir que las personas usen URL RESTful para compartir su vista de espacio de trabajo renderizado por jquery.

En nuestro caso, pasamos una lista de los componentes que deben procesarse y utilizamos Razor para traducirlos nuevamente a las llamadas a jquery.

11

Sí, es definitivamente posible usando Javascript Resultado:

return JavaScript("Callback()"); 

Javascript debe ser referenciado por su punto de vista:

function Callback(){ 
    // do something where you can call an action method in controller to pass some data via AJAX() request 
} 
+0

Muestra 'Callback()' en la página web. – Imad

1

Si he entendido bien la pregunta, que desea tener un código JavaScript en tu controlador. (Su pregunta es lo suficientemente clara, pero las respuestas votadas y aceptadas arrojan algunas dudas) Entonces: puede hacerlo utilizando el control System.Windows.Forms.WebBrowser de .NET para ejecutar el código de JavaScript y todo lo que un navegador puede hacer. Sin embargo, requiere una referencia a System.Windows.Forms, y la interacción es algo así como "old school". Por ejemplo:

void webBrowser1_DocumentCompleted(object sender, 
    WebBrowserDocumentCompletedEventArgs e) 
{ 
    HtmlElement search = webBrowser1.Document.GetElementById("searchInput"); 
    if(search != null) 
    { 
     search.SetAttribute("value", "Superman"); 
     foreach(HtmlElement ele in search.Parent.Children) 
     { 
      if (ele.TagName.ToLower() == "input" && ele.Name.ToLower() == "go") 
      { 
       ele.InvokeMember("click"); 
       break; 
      } 
     } 
    } 
} 

Probablemente hoy en día, esa no sea la solución más fácil.

La otra opción es utilizar Javascript .NET o jint para ejecutar javasctipt, u ​​otra solución, según el caso específico.

Algunas preguntas relacionadas sobre este tema o posibles duplicados:

Embedding JavaScript engine into .NET

Load a DOM and Execute javascript, server side, with .Net

Espero que esto ayude.

11

Para aquellos que acaban de utilizar un formulario estándar (no AJAX), existe otra forma de activar el código JavaScript/JQuery al finalizar su acción.

Primero, cree una propiedad de cadena en su Modelo.

public class MyModel 
{ 
    public string JavascriptToRun { get; set;} 
} 

Ahora, se unen a su nueva propiedad de modelo en el Javascript de su punto de vista:

<script type="text/javascript"> 
    @Model.JavascriptToRun 
</script> 

Ahora, también, en su opinión, cree una función Javascript que hace lo que tiene que hacer:

<script type="text/javascript"> 
    @Model.JavascriptToRun 

    function ShowErrorPopup() { 
      alert('Sorry, we could not process your order.'); 
    } 

</script> 

por último, en su acción del controlador, es necesario llamar a esta nueva función Javascript:

[HttpPost] 
public ActionResult PurchaseCart(MyModel model) 
{ 
    // Do something useful 
    ... 

    if (success == false) 
    { 
     model.JavascriptToRun= "ShowErrorPopup()"; 
     return View(model); 
    } 
    else 
     return RedirectToAction("Success"); 
} 
+1

gran retoque, muchas gracias – smoothumut

0
<script> 
    $(document).ready(function() { 
     var msg = '@ViewBag.ErrorMessage' 
     if (msg.length > 0) 
      OnFailure('Register', msg); 
    }); 

    function OnSuccess(header,Message) { 
     $("#Message_Header").text(header); 
     $("#Message_Text").text(Message); 
     $('#MessageDialog').modal('show'); 
    } 

    function OnFailure(header,error) 
    { 
     $("#Message_Header").text(header); 
     $("#Message_Text").text(error); 
     $('#MessageDialog').modal('show'); 
    } 
</script> 
Cuestiones relacionadas