使用Ajax将表单数据发布到Controller操作

时间:2012-04-25 13:51:34

标签: ajax asp.net-mvc-3 jquery asp.net-ajax

我在MVC3中有一个页面,带有一个链接(Ajax.ActionLink)。当用户单击它时,它会调用控制器的操作,并将结果插入到div中,并使用replace。

代码如下所示:

@Ajax.ImageActionLink("/Images/btn_share.png", "Share pool", "SharePool", new { poolKey = Model.Id, poolName = Model.Name },
    new AjaxOptions { 
        UpdateTargetId="popup", 
        HttpMethod="GET", 
        InsertionMode = InsertionMode.Replace,
        LoadingElementId="loading_dialog",
        OnSuccess = "ShowPopup('#popup_share', true, true)"
    } 

ImageLinkAction是使用图像作为链接的自定义扩展方法,而ShowPopup是一个javascript函数,显示更新的div(使其看起来像弹出窗口)

现在插入到创建弹出窗口的div中的标记代码包含一个表单,如下所示

<div>
@using (Html.BeginForm()) {

    @Html.HiddenFor(model => model.ID)

    <div class="editor-label">
        @Html.LabelFor(model => model.EmailAddress)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.EmailAddress)
        @Html.ValidationMessageFor(model => model.EmailAddress)
    </div>

    // ... other fields

    @Html.ValidationSummary(true)
    <p>
        <button type ="submit">Share</button>       
    </p>
}
</div>

问题在于表单的提交:“提交”按钮调用正确的操作,但使用回发,这会导致我的页面刷新。我需要的是用ajax发布数据,接收响应,这是插入

的另一个局部视图

我试图用Ajax.ActionLink替换Submit按钮,如下所示

    @Ajax.ActionLink("Share", "Share",
        new Models.MyModel 
            {
                ID = Model.ID,
                EmailAddress = Model.EmailAddress
            },
        new AjaxOptions
            {
                UpdateTargetId="popup", 
                HttpMethod="POST", 
                InsertionMode = InsertionMode.Replace,
                LoadingElementId="loading_dialog",
                OnSuccess = "ShowPopup('#popup_share', true, true)"
            }

控制器的代码如下所示:

[HttpPost]
public ActionResult SharePool(MyModel model)
{
    // ...
    return PartialView("_MyPartialView", model)
}

问题是,在呈现Ajax ActionLink时(加载表单时),Model.EmailAddress中没有值,因此我在控制器中的POST操作只接收ID参数。

我该如何处理?理想情况下,我认为我应该添加

OnBegin = "PreparePostData()"

但是因为我基本上只知道javascript,所以我不知道如何实现它。我认为这个PreparePostData()应该收集表单字段并准备对象routeValues参数,在调用ajax调用之前设置它。

任何人都可以给我一些关于如何实现这一点的指示?

或者对这个问题采取其他更好的方法吗?

谢谢

2 个答案:

答案 0 :(得分:16)

我建议用jQuery编写自己的AJAX调用。无论如何,它比MVC的助手更灵活

@Html.ActionLink("Share", "Share", new { }, new { id = "share" })

然后是一个函数

$("#share").click(function (e) {
   e.preventDefault();
   //Show loading display here
   var form= $("#shareForm");
   $.ajax({
       url : '@Url.Action("Share")',
       data: form.serialize(),
       type: 'POST',
       success: function(data){
          //Show popup
          $("#popup").html(data);
       }
   });
});

答案 1 :(得分:0)

当你在同一页面上有多个表格时(想象一下你要按需显示/隐藏的情况),你需要在#Id之前添加表格如下:

$("#share").click(function (e) {
   e.preventDefault();
   //Show loading display here

// Need to add Form before #id 
   var form= $("Form#share");

   $.ajax({
       url : '@Url.Action("Share")',
       data: form.serialize(),
       type: 'POST',
       success: function(data){
          //Show popup
          $("#popup").html(data);
       }
   });
);