Я просто отправляю обычный запрос POST с помощью Ajax.BeginForm ... я выводю элементы формы с помощью .TextBoxFor и .HiddenFor и т.д ... все, как я должен ... и когда он отправляется через ajax в мой метод действия, объект в методе действия (названный «Комментарий») не заполнен значениями!
Я что-то упускаю? вот соответствующая часть моего кода для тех, кто хочет ее увидеть ...
<% 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 = New FPicDataContext Dim Updatable = (From c In db.Comments Где c.CommentID = UpCom.CommentID) .FirstOrDefault Updatable.Comment = UpCom.Comment 'ЭТО ГДЕ ОБЪЕКТ ЕСТЬ НУЛЕВАЯ ОШИБКА! ОСНОВНО, ВСЕ ЗНАЧЕНИЯ В UPCOM (КАК КОММЕНТАРИЙ) НУЖНЫ ИЛИ НИЧЕГО. db.SubmitChanges ()
Dim cm = новая модель комментария с {.Comment = UpCom, .CommentDivId = "CommentDiv" и UpCommentID.ToString}
Вернуть PartialView («Комментарий», см)
Конечная функция
3 ответа
Эта проблема, которую я, в конце концов, решил, оказывается, что имя объекта, к которому привязана модель в аргументе действия, должно быть таким же, как имя объекта, которое вы использовали при выполнении TextBoxFor BeginForm и т.д ... протестировано, подтверждено, вот и все!
Иными словами, вместо этого UpCom
нужно было назвать Comment
:).
Однако, предостережение, я нигде не слышал об этом требовании, ни в какой документации или чем-то еще !! у кого-нибудь есть мысли по этому поводу?
Подождите, я думаю, я понимаю, что вы пытаетесь сделать сейчас, и ответ - да, абсолютно.
Вы можете взять несколько плагинов jQuery, которые позволят публиковать формы с помощью Ajax.
Я использовал этот, и он отлично работает. Подключаемый модуль jQuery Form Это тоже может сработать для вас. .submit
@ 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" } )%>
Как вы объяснили, все это было в имени, но я хочу уточнить, что это имя лямбда-выражения, к которому вы привязываете поля. Когда я изменил его на:
foreach ( var Finding in Model.Findings ) /* Does Work */
.
.
.
<td> <%: Html.TextAreaFor(m => Finding.Description)%> </td>
ModelBinding автоматически во всем разобрался. Я совершенно новичок в использовании встроенных функций ms ajax и вообще довольно новичок в mvc, но это помогло. Спасибо!
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.