如何获取Ajax.ActionLink调用操作方法的用户输入?

时间:2009-07-18 19:35:08

标签: asp.net-mvc

假设我想使用ajax动作链接保存一个字段而不更改视图。

这是我的观点(它是一个绑定到Model的强类型视图):

   <%= Html.TextBox("myComment", Model.MyComment)%>
   <%= Ajax.ActionLink("SAVE", "SaveComment", "Home",
       Model, new AjaxOptions { HttpMethod = "POST"})
   %>

这是我对控制器中ajax actionlink的操作:

[AcceptVerbs(HttpVerbs.Post)]
public void SaveComment(Model model)
{
    MyRepository repository = new MyRepository();
    Model mod = repository.GetModel(model.ID);
    mod.MyComment = model.MyComment;

    try
    {
        repository.Save();
    }
    catch(Exception ex)
    {
        throw ex;
    }          
}

问题是:我无法在动作方法中的Mycomment文本框中获取用户输入。无论用户在Mycomment的浏览器中输入什么,当点击Ajax ActionLink SAVE时,我都会检查来自Mycomment的param模型的值,MyComment没有任何变化。

困惑的是:模型应绑定到双向查看。但对于这种情况,似乎没有。 然后我将Ajax.ActionLink调用更改为:

Ajax.ActionLink("SAVE", "SaveComment", "Home",
       new {commentinput =Model.MyComment, new AjaxOptions { HttpMethod = "POST"})

然后将操作方法​​签名更改为:

public void SaveComment(string commentinput)

我仍然无法获得用户输入。

如何在控制器操作方法中获取用户输入?

1 个答案:

答案 0 :(得分:4)

AFAIK Ajax.ActionLink不允许您轻松获取表单值并使用AJAX发布它们。有一些workarounds似乎非常hackish(查看最后一段动态调整URL 让我哭泣)。

这是jQuery方式(如果与MS Ajax相比,我更喜欢它):

<%= Html.TextBox("myComment", Model.MyComment) %>
<%= Html.ActionLink("SAVE", "SaveComment", "Home", new { id = "saveComment" }) %>

然后不引人注意地将单击事件处理程序附加到锚点:

$(function() {
    $('a#saveComment').click(function(evt) {
        $.ajax({
            url : this.href,
            data: {
                // Assuming your model has a property called MyComment
                myComment: $('#myComment').val()
            },
            success: function(data, textStatus) {
                // Comment saved successfully
            }
        });
        evt.preventDefault();
    });
});