我在 MVC3 中有一个页面,带有一个链接(Ajax.ActionLink)。当用户单击它时,它会调用控制器的操作,并将结果插入到一个 div 中,并带有替换。
代码如下所示:
@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 是显示更新的 div 的 javascript 函数(使其看起来像弹出窗口)
现在,插入到创建弹出窗口的 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 替换提交按钮,如下所示
@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 调用之前设置。
任何人都可以给我一些关于如何实现这一点的指示吗?
还是有其他更好的方法来解决这个问题?
谢谢