在ASP.NET MVC中通过jQuery提交表单时传递参数

时间:2010-10-23 19:12:59

标签: c# javascript asp.net jquery asp.net-mvc

我正在尝试通过jQuery Ajax向我的控制器提交表单。以下代码大部分都有效,但是,ThreadId参数不会被传递。如果我在不使用jQuery的情况下直接调用控制器,它会被传递,但是当使用jquery时,我在form.serialize()之后看不到ThreadId。什么是将参数(如ThreadId)传递给jQuery表单帖子的最简单方法?

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");
        }

1 个答案:

答案 0 :(得分:4)

ThreadId参数包含在表单的action属性中。当您正在调整此表单时,您将发布到/Home/AddComment并且不再提供此参数。您可以执行以下操作来解析它:

$('#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;
});

另一种可能性是将表单中的ThreadId参数作为隐藏字段包含在内,而不是将其放在action属性中。