2010-10-23 7 views
1

J'essaie de soumettre un formulaire à mon contrôleur via jQuery Ajax. Le code suivant fonctionne pour la plupart, cependant, le paramètre ThreadId n'est pas transmis. Si j'appelle le contrôleur directement sans utiliser jQuery, il est transmis, mais lors de l'utilisation de jquery, je ne vois pas le ThreadId après form.serialize(). Quel serait le moyen le plus simple de transmettre des paramètres (comme ThreadId) à un formulaire jQuery?Passer des paramètres lors de la soumission d'un formulaire via jQuery dans ASP.NET MVC

ASPX

<% Html.BeginForm("AddComment", "Home", new { ThreadId = Model.Id }, 
    FormMethod.Post, new { @id = "AddComment" + Model.Id.ToString(), 
    @onsubmit = "javascript:AddComment(this);return false" }); %> 
<%: Html.TextBox("CommentText", "", new { @class = "comment-textbox" })%> 
<input id="Comment" type="submit" name="submitButton" value="Post Comment" /> 
<% Html.EndForm(); %> 

JavaScript

AddComment = function (sender) { 
    var form = $(sender); 
    var data = form.serialize(); 
    $.ajax({ 
     type: "POST", 
     url: "/Home/AddComment", 
     data: data, 
     dataType: "html", 
     success: function (response) { 
      alert(response); 
     }, 
     error: function (error) { 
      alert(error); 
     } 
    }); 
    return false; 
}; 

CONTROLLER

[HttpPost] 
     public ActionResult AddComment(string submitButton, Comment comment) 
     { 
      comment.CreatedDate = DateTime.Now; 
      comment.PosterId = LoggedInUser.Id; 

      _repository.AddComment(comment); 
      _repository.Save(); 

      if (Request.IsAjaxRequest()) 
      { 
       return View("Comment", comment); 
      } 
      else 
       return RedirectToAction("Index"); 
     } 

Répondre

4

Le paramètre ThreadId est inclus dans l'attribut action du formulaire. Lorsque vous ajaxifiez ce formulaire, vous postez sur /Home/AddComment et vous ne fournissez plus ce paramètre. Vous pouvez faire ce qui suit pour ajaxify il:

$('#idofyourform').submit(function() { 
    $.ajax({ 
     // use the method as defined in the <form method="POST" ... 
     type: this.method, 

     // use the action as defined in <form action="/Home/AddComment?ThreadId=123" 
     url: this.action, 

     data: $(this).serialize(), 
     dataType: 'html', 
     success: function (response) { 
      alert(response); 
     }, 
     error: function (error) { 
      alert(error); 
     } 
    }); 
    return false; 
}); 

Une autre possibilité est d'inclure le paramètre ThreadId dans la forme que sur le terrain caché au lieu si le mettre dans l'attribut action.

+0

Merci! Vous avez raison l'action a l'URL correcte. Cependant, pour une raison quelconque, au lieu d'appeler ma méthode AddComment, ma méthode Index est appelée. J'essaie toujours de comprendre pourquoi. – Prabhu

+0

Peu importe, je faisais form.action, alors que ça aurait dû être sender.action. Merci de votre aide. – Prabhu

+0

Btw, j'ai 2 boutons dans le formulaire et quand je le faisais sans jquery j'ai utilisé l'attribut de nom sur le bouton d'entrée pour savoir quel bouton a envoyé la demande à la fin du contrôleur. Une idée de comment je peux le faire avec jquery? – Prabhu

Questions connexes