假设我想使用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)
我仍然无法获得用户输入。
如何在控制器操作方法中获取用户输入?
答案 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();
});
});