Я просто отправляю обычный запрос 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 («Комментарий», см)

Конечная функция

5
Erx_VB.NExT.Coder 23 Фев 2010 в 05:22
Я ожидал, что это тоже сработает! ???
 – 
jwwishart
23 Фев 2010 в 05:33
Просьба использовать код метода действия POST и HTML-вывод вашего представления.
 – 
LukLed
23 Фев 2010 в 05:56
Привет, я обновил исходный пост запрошенными деталями :)
 – 
Erx_VB.NExT.Coder
23 Фев 2010 в 07:30
Я использую в качестве «взлома» прямо сейчас как Request («comment.CommentID»), так и Request («comment.Comment»), чтобы получить комментарий и commentId, но, боже, это ужасно, я бы очень хотел делай так, как задумано, красиво и элегантно !! у кого есть идеи?
 – 
Erx_VB.NExT.Coder
23 Фев 2010 в 08:42

3 ответа

Лучший ответ

Эта проблема, которую я, в конце концов, решил, оказывается, что имя объекта, к которому привязана модель в аргументе действия, должно быть таким же, как имя объекта, которое вы использовали при выполнении TextBoxFor BeginForm и т.д ... протестировано, подтверждено, вот и все!

Иными словами, вместо этого UpCom нужно было назвать Comment :).

Однако, предостережение, я нигде не слышал об этом требовании, ни в какой документации или чем-то еще !! у кого-нибудь есть мысли по этому поводу?

2
Erx_VB.NExT.Coder 24 Фев 2010 в 20:05
2
Зачем кому-то голосовать против, когда я пытался дать ответ всем, кто мог бы найти его полезным, я мог бы просто ничего не сказать и оставить его таким образом, мне не выгодно давать ответ. Я думаю, что у SO есть много снобов-программистов, которые получают удовольствие от попыток принизить других, пытаясь при этом выглядеть выше других в попытке удовлетворить свою неуверенность в других сферах своей жизни, после 60 вопросов я вижу это повсюду. на самом деле, чрезмерно снобистские программисты, которые просто пресыщены собой. Что это говорит о программистах в целом? Любопытный!
 – 
Erx_VB.NExT.Coder
30 Окт 2010 в 02:17

Подождите, я думаю, я понимаю, что вы пытаетесь сделать сейчас, и ответ - да, абсолютно.

Вы можете взять несколько плагинов jQuery, которые позволят публиковать формы с помощью Ajax.

Я использовал этот, и он отлично работает. Подключаемый модуль jQuery Form Это тоже может сработать для вас. .submit

1
griegs 23 Фев 2010 в 05:40
2
Привет, спасибо за эту информацию, однако я сначала попробую использовать ajax.beginForm (лучше проверять время компиляции), чтобы сделать это, я надеюсь, что он будет работать так, как рекламируется, иначе я думаю, что я что-то упускаю, если я не не научиться делать это так, как задумано ...
 – 
Erx_VB.NExT.Coder
23 Фев 2010 в 07:32

@ 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, но это помогло. Спасибо!

1
SenseiHitokiri 20 Май 2011 в 21:05
Большое спасибо за вашу разработку, я рад, что это было полезно, и проголосовали за вас, чтобы люди могли видеть ваш ответ для дополнительных разъяснений :). Кроме того, если я правильно помню проблему, я не думаю, что mvc нравится, когда вы используете одни и те же имена для родительского и дочернего объекта / свойства, например, я использовал "Comment.Comment", где 1-й комментарий - это объект, а 2-й - строка.
 – 
Erx_VB.NExT.Coder
9 Июл 2011 в 20:50