【问题标题】:Does MVC 2.0 model binding work with Ajax requests?MVC 2.0 模型绑定是否适用于 Ajax 请求?
【发布时间】:2010-02-23 02:22:03
【问题描述】:

我只是使用 Ajax.BeginForm 发送一个普通的 POST 请求...我使用 .TextBoxFor 和 .HiddenFor 等输出表单元素...我应该这样做...当它通过 ajax 发布到我的action 方法,action 方法中的对象(名为“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) %>

这是引发错误的操作方法...当我尝试使用该对象时,错误是空引用异常:

 Function UpdateComment(ByVal UpCom As Comment) As ActionResult

Dim db = 新的 FPicDataContext Dim Updatable = (From c In db.Comments Where c.CommentID = UpCom.CommentID).FirstOrDefault Updatable.Comment = UpCom.Comment ' 这是对象为 NULL 的地方引发错误!基本上,UPCOM(作为评论)中的所有值都是 0 或什么都不是。 db.SubmitChanges()

Dim cm = 带有 {.Comment = UpCom, .CommentDivId = "CommentDiv" & UpCom.CommentID.ToString} 的新 CommentModel

返回 PartialView("Comment", cm)

结束函数

【问题讨论】:

  • 我希望这也能工作! ???
  • 请提供使用 POST 操作方法代码和您的视图的 HTML 输出。
  • 你好,我已经用请求的详细信息更新了原始帖子 :)
  • 我现在正在使用 Request("comment.CommentID") 和 Request("comment.Comment") 来获取评论和 commentId,但上帝是太棒了,我真的很想按照它应该做的方式去做,以优雅而优雅的方式!有人有什么想法吗?

标签: c# .net asp.net asp.net-mvc vb.net


【解决方案1】:

这个问题我最终解决了,结果模型绑定到动作参数的对象名称必须与您在执行 TextBoxFor BeginForm 等时使用的对象名称相同......经过测试,确认,就是这样!

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

但是,请注意,我在任何地方、任何文档或任何内容中都没有听说过此要求!有人对此有任何想法吗?

【讨论】:

  • 为什么有人会在努力为任何可能觉得有用的人提供答案时投反对票,我本可以什么也没说,就这样离开了,它没有好处我来提供答案。我认为 SO 有很多程序员势利小人,他们试图贬低别人,同时试图看起来比别人优越,试图满足他们在生活其他方面的不安全感,在 60 个问题之后,我看到了这一切真的,过于势利的程序员,他们只是充满了自己。这对一般程序员来说意味着什么?好奇!
【解决方案2】:

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

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

我用过这个,效果很好。 jQuery Form Plugin 这个也可能对你有用。 .submit

【讨论】:

  • 嘿,谢谢您提供此信息,但是我会先尝试使用 ajax.beginForm(更好的编译时间检查)来执行此操作,我希望它会像宣传的那样工作,否则我想我如果我不学习如何按照预期的方式去做,我会错过一些东西......
【解决方案3】:

@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)

并在表格内打印字段。每当我发帖时,我都会获得对 Action 的回击,但就像你说的,对象是 null:

<%: 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”,其中第一个注释是对象,第二个是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多