2010-02-23 22 views
5

solo estoy enviando una solicitud POST normal usando Ajax.BeginForm ... obtengo los elementos del formulario usando .TextBoxFor y .HiddenFor etc ... todo como debería ... y cuando se publica a través de ajax en mi acción método, el objeto en el método de acción (llamado "Comentario") no se llena con los valores!¿El enlace modelo MVC 2.0 funciona con solicitudes Ajax?

¿Echo de falta algo? aquí está la parte correspondiente del código para los que quieren verlo ...

<% Using Ajax.BeginForm("UpdateComment", "Home", 
    New AjaxOptions With {.UpdateTargetId = Model.CommentDivId, 
    .HttpMethod = FormMethod.Post})%> 

y ....

<%= 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) %> 

aquí es el método de acción, lo que eleva el error ... el error es una excepción de referencia nula cuando intento para utilizar el objeto:

Function UpdateComment(ByVal UpCom As Comment) As ActionResult 

Dim db = New FPicDataContext Dim actualizable = (de c En db.Comments Dónde c.CommentID = UpCom.CommentID) .FirstOrDef ault Updatable.Comment = UpCom.Comment 'ESTO ES DONDE EL OBJETO ES NULO EL ERROR SE LEVANTA! BÁSICAMENTE, TODOS LOS VALORES EN UPCOM (COMO COMENTARIO) SON 0 O NADA. db.SubmitChanges()

Dim cm = Nueva CommentModel Con {.comment = UpCom, .CommentDivId = "CommentDiv" & UpCom.CommentID.ToString}

Volver PartialView ("Comentario", cm)

End Function

+0

¡Hubiera esperado que esto funcionara también! ??? – jwwishart

+0

Las razones dan el código de método de acción POST y el resultado HTML de su vista. – LukLed

+0

hola, he actualizado la publicación original con los detalles solicitados :) –

Respuesta

2

este problema finalmente resuelto, resulta que el nombre del objeto que el modelo está vinculado al argumento de acción debe ser el mismo que el nombre del objeto que usó al hacer el TextBoxFor BeginForm etc ... probado, confirmado, eso fue todo !

por lo que, en otras palabras, UpCom tuvo que llamarse Comment en su lugar :).

Sin embargo, una nota de precaución, no he oído hablar de este requisito en ningún lugar, en cualquier documentación o algo así. Alguien tiene alguna idea sobre esto?

+2

¿Por qué alguien votaría por una respuesta cuando se dedicara al esfuerzo de proporcionar la respuesta a cualquiera que la encuentre útil? No podría haber dicho nada y lo dejé así, no me beneficia proporcionar la respuesta. Creo que SO tiene muchos snobs programadores a los que les gusta criticar a los demás mientras intentan lucir superiores a los demás en un intento de satisfacer sus inseguridades en otras partes de sus vidas. Después de 60 preguntas, veo todo así. De hecho, los programadores demasiado snob que están llenos de sí mismos. ¿Qué dice esto sobre los programadores en general? ¡Curioso! –

1

Espere, creo que veo lo que está tratando de hacer ahora y la respuesta es sí absolutaly.

Hay un par de complementos de jQuery que puede capturar que permitirán la publicación de formularios usando Ajax.

He usado este y funciona bien. jQuery Form Plugin Éste también podría funcionar para usted. .submit

+0

Jquery.Form es increíble. – jfar

+0

Sí, es genial. – griegs

+2

gracias por esta información, sin embargo, intentaré usar primero ajax.beginForm (mejor tiempo de compilación) para hacer esto, espero que funcione como se anuncia, de lo contrario, creo que me estoy perdiendo algo si no lo hago. No aprende a hacerlo de la forma en que está previsto hacerlo ... –

1

@ Erx_VB.NExt.Coder Te devolví el punto porque me tropecé con esto buscando algo más y, finalmente, toqué el mismo problema, pero la redacción no era la más clara, así que quería actualizar y tratar de ayudar. En mi ejemplo, repetición de un objeto a través de hallazgos

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

y mi controlador:

public void Update(ReportFindingViewModel Finding) 

e imprimir los campos a cabo dentro de una tabla.Que estaba recibiendo golpes de nuevo a la acción cada vez que publico, pero como usted ha dicho, el objeto era nulo:

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

Como se ha explicado, era todo en el nombre, pero lo que quiero aclarar es que es el nombre de la expresión lambda a la que se une en los campos. Cuando lo cambié a:

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

el ModelBinding lo imaginó automáticamente. Soy completamente nuevo en el uso de la funcionalidad ms ajax incluida y bastante nuevo en mvc, pero esto me ayudó. ¡Gracias!

+0

@senseilhitokiri muchas gracias por su elaboración, estoy contento de que esto haya sido útil y lo he votado para que la gente pueda ver su respuesta para una aclaración adicional :). Además, si recuerdo el problema correctamente, no creo que a mvc le guste cuando usa los mismos nombres para objeto/propiedad principal y secundario, como usé "Comment.Comment", donde 1st comment es object y 2nd es string. –

Cuestiones relacionadas