2012-06-13 55 views
8

Tengo una aplicación ASP.NET MVC3 y cuando el usuario hace clic en mi etiqueta de anclaje, quiero enviar 3 piezas de datos a una acción:Enviar datos con jQuery a un controlador MVC

<a onclick='editDescription(<#= DocID,FileName,Description #>)'></a> 

Este es el javascript para llamar a mi acción:

function editDescription(docId,fileName,description) { 
    var url = "@Url.Content("~/OrderDetail/_EditDescription/")" + docId+'/'+ 
    fileName + '/' + description; 
    //do the rest} 

mi acción:

public ActionResult _EditDescription(string id,string filename, string descritpion) 

las piezas im preocupados por nombre de archivo y son Descriptio n ya que estos pueden ser loooooong y yo no quiero una URL que aparezca así:

http://localhost/OrderDetail/_EditDescription/123/some long filename.pdf/this is a long description for the name 

¿Cómo puedo enviar a través de mis datos a mi acción sin tener que enviarlo como una cadena de consulta? Gracias

+0

¿Usted intentó hacer una $ .ajax con el tipo: 'post'? –

+0

no ... ¿puede proporcionar una muestra rápida? – BoundForGlory

+0

@David ya lo hizo :), ver abajo. –

Respuesta

16

Usted puede usar el método jQuery $ .ajax:

<div id="what-I-want-updated"> 

    <input id="whatever-the-id-is" type="text" value="@Model.ID" /> 
    <br /> 
    <input id="whatever-the-filename" type="text" value="@Model.Filename" /> 
    <br /> 
    <input id="whatever-the-description" type="text" value="@Model.Description" /> 
    <br /> 
    <button id="whatIsClicked">Update!</button> 

</div> <!-- /#what-I-want-updated --> 

<script> 

    // You're probably clicking something to initiate update 
    var $whatIsClicked = $('#whatIsClicked'); 

    // .live persists on the page even after other ajax calls 
    // So when the thing is clicked 
    $whatIsClicked.live('click', function() { 

     // Grab the information needed to update 
     var theId = $('#whatever-the-id-is').val(); //Or it could be .text() 
     var theFilename = $('#whatever-the-filename').val(); 
     var theDescript = $('#whatever-the-description').val(); 

     // Let's edit the description! 
     $.ajax({ 
     type: "POST", 
     url: "OrderDetail/_EditDescription", // the method we are calling 
     contentType: "application/json; charset=utf-8", 
     data: {id: theId, filename: theFilename, description: theDescript}, 
     dataType: "json", 
     success: function (result) { 
      alert('Yay! It worked!'); 
      // Or if you are returning something 
      alert('I returned... ' + result.WhateverIsReturning);      
     }, 
     error: function (result) { 
      alert('Oh no :('); 
     } 
    }); 
    }); 
</script> 

A pesar de que seguirá siendo el trabajo, asegúrese de cambiar su método de controlador a:

[HttpPost] 
public ActionResult _EditDescription(string id, string filename, string descritpion) 
2

Puede hacer una publicación completa del formulario si lo desea a través de ajax $.post o mediante una acción con el atributo [HttpPost].

+0

Esto no está en una forma más la forma en que se configura la vista, el usuario puede hacer varias cosas independientemente de los demás, por lo que no se necesita un formulario. Necesito una muestra rápida de lo segundo que sugeriste – BoundForGlory

0

Declarar su acción como un POSTAL

[HttpPost] 
public ActionResult _EditDescription(string docId, string filename, string description) 

Crear un formulario HTML invisible:

<form action="@Url.Content("~/OrderDetail/_EditDescription/")" method="post" name="editDescriptionForm"> 
    <input type="hidden" name="docId" /> 
    <input type="hidden" name="fileName" /> 
    <input type="hidden" name="description" /> 
</form> 

Rellene el formulario y enviarlo con JS:

function editDescription(docId, fileName, description) { 
    document.editDescriptionForm.docId = docId; 
    ... 

    document.editDescriptionForm.submit(); 
} 
Cuestiones relacionadas