MVC 2.0模型绑定是否适用于Ajax请求?

5
我只是使用Ajax.BeginForm发送一个普通的POST请求... 我使用.TextBoxFor和.HiddenFor等输出表单元素... 一切都应该正常... 当它通过ajax发布到我的操作方法时,操作方法中的对象(名为“Comment”)没有填充值!
我错过了什么吗?以下是想要查看其相关部分的代码...
<%  Using Ajax.BeginForm("UpdateComment", "Home",
    New AjaxOptions With {.UpdateTargetId = Model.CommentDivId,
    .HttpMethod = FormMethod.Post})%>

并且...

    <%= Html.HiddenFor(Function(x) x.Comment.CommentID)%>

 <%= Html.TextAreaFor(Function(x) x.Comment.Comment, 8, 40,
                   New With {.style = "overflow: hidden;"})%>

    <%= Html.ValidationMessageFor(Function(x) x.Comment.Comment) %>

这里是Action方法,当我尝试使用对象时,它会引发一个错误...错误是空引用异常:

 Function UpdateComment(ByVal UpCom As Comment) As ActionResult

Dim db = New FPicDataContext ' 在数据库中查找符合条件的记录 Dim Updatable = (From c In db.Comments Where c.CommentID = UpCom.CommentID).FirstOrDefault ' 更新记录内容 Updatable.Comment = UpCom.Comment ' 这里出现了对象为空的错误!基本上,UpCom 中的所有值(作为 Comment)都是 0 或 Null。 ' 提交更改到数据库 db.SubmitChanges()

Dim cm = New CommentModel With {.Comment = UpCom, .CommentDivId = "CommentDiv" & UpCom.CommentID.ToString}

Return PartialView("Comment", cm)

End Function


我本来也以为这会起作用的!??? - jwwishart
请提供您使用的POST动作方法代码和视图的HTML输出。 - LukLed
你好,我已经更新了原始帖子并提供了所请求的细节 :) - Erx_VB.NExT.Coder
我现在使用Request("comment.CommentID")和Request("comment.Comment")作为“hack”的方式来获取评论和评论ID,但这真的很糟糕,我真的想以正确、优雅的方式来完成它!有人有什么想法吗? - Erx_VB.NExT.Coder
3个回答

2

我最终解决了这个问题,原来在action参数中绑定的模型对象名称必须与你在TextBoxFor BeginForm等操作时使用的对象名称相同...测试确认,就是这个问题!

换句话说,UpCom必须改为Comment :)。

但是请注意,我没有在任何文档或其他地方听说过这个要求!!有什么想法吗?


2
为什么有人会对一个回答进行负评,当我已经花费了精力为任何可能发现它有用的人提供答案时,我本可以什么都不说而让它保持原样,提供答案对我没有好处。我认为SO有很多程序员势利眼,他们试图在尝试看起来比别人更优越的同时贬低其他人,以满足他们在生活的其他方面的不安全感,在60个问题之后,我真的在SO上看到这一点,过于势利眼的程序员自以为是。这反映了程序员整体的形象吗?好奇! - Erx_VB.NExT.Coder

1

@Erx_VB.NExt.Coder,我把分数还给了你,因为我在寻找其他东西时偶然发现了这个问题,并最终遇到了相同的问题,但措辞不是很清晰,所以我想更新并尝试帮助。在我的示例中,我通过Findings对象进行迭代。

foreach ( var row in Model.Findings )  /* Doesn't Work */
.
.
.
<td> <%: Html.TextAreaFor(m => row.Description)%> </td>

我的控制器:

public void Update(ReportFindingViewModel Finding)

并将字段打印在表格内。每当我提交时,我都会返回到该操作,但就像你所说的那样,该对象为空:

<%: Ajax.BeginForm("Update", "ReportFinding", new AjaxOptions { HttpMethod = "Post" } )%>

正如您所解释的那样,一切都在名称上,但我想澄清的是,它是绑定到字段中的lambda表达式的名称。当我将其更改为:

foreach ( var Finding in Model.Findings ) /* Does Work */
.
.
.
<td> <%: Html.TextAreaFor(m => Finding.Description)%> </td>

ModelBinding 自动神奇地解决了所有问题。我完全是第一次使用包含的 ms ajax 功能,对于 mvc 也很新,但这真的帮了我很多。谢谢!


@ senseilhitokiri非常感谢您的详细说明,我很高兴这很有用,并且已经为您投票,以便人们可以查看您的答案以获得更多澄清。 :)另外,如果我正确地记得问题,我认为mvc不喜欢您使用相同的父对象/属性和子对象/属性名称,例如我使用的“Comment.Comment”,其中第一个评论是对象,第二个是字符串。 - Erx_VB.NExT.Coder

1

等一下,我现在明白你想做什么了,答案是肯定的。

有几个jQuery插件可以让你使用Ajax提交表单。

我用过这个插件,它很好用。jQuery Form Plugin 这个也可能适合你。.submit


2
嗨,感谢你提供的信息。不过,我会先尝试使用ajax.beginForm(更好的编译时间检查)来实现这一点,我希望它能像广告中所说的那样工作,否则我认为我错过了学习按照预期做事的方法... - Erx_VB.NExT.Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接