代码之家  ›  专栏  ›  技术社区  ›  Erx_VB.NExT.Coder

mvc 2.0模型绑定是否适用于ajax请求?

  •  5
  • Erx_VB.NExT.Coder  · 技术社区  · 15 年前

    我只是用ajax发送一个普通的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 updateable=(来自db.comments中的c,其中c.commentid=upcom.commentid).firstordefault updateable.comment=upcom.comment'这是引发对象为空错误的地方!基本上,upcom中的所有值(作为注释)都是0或零。 数据库提交更改()

    dim cm=new commentmodel和{.comment=upcom、.commentdivid=“commentdiv”&upcom.commentid.tostring}

    返回partialview(“注释”,cm)

    端函数

    3 回复  |  直到 13 年前
        1
  •  2
  •   Erx_VB.NExT.Coder    15 年前

    我最终解决了这个问题,发现模型在实际参数中绑定到的对象名必须与您在为beginform等执行textbox时使用的对象名相同…测试,确认,就是这样!

    换句话说, UpCom 必须被命名 Comment 相反:)

    不过,请注意,我在任何地方,任何文档或任何东西都没有听说过这个要求!!有人有什么想法吗?

        2
  •  1
  •   griegs    15 年前

    等等,我想我知道你现在想做什么了,答案是肯定的。

    有几个jquery插件可以使用ajax发布表单。

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

        3
  •  1
  •   SenseiHitokiri    13 年前

    @erx_vb.next.coder我给了你答案,因为我无意中发现了这个问题,我在寻找其他东西,并最终遇到了同样的问题,但措辞不是最清晰的,所以我想更新并尝试帮助。在我的示例中,我通过

    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>
    

    模型绑定自动神奇地解决了这一切。我对使用附带的ms ajax功能和mvc完全不熟悉,但这有帮助。谢谢!