ADDENDUM: несколько HTML-форм, например, в сетке
В качестве дополнения к этой проблеме, ОЧЕНЬ нужно быть ОЧЕНЬ осторожным с несколькими формами на одной странице, например, в сетке, например, сгенерированной с использованием Ajax.BeginForm.
У вас может возникнуть желание написать что-то вроде:
@foreach (var username in Model.TutorUserNames)
{
<tr>
<td>
@Html.ActionLink(username, MVC.Admin.TutorEditor.Details(username))
</td>
<td>
@using (Ajax.BeginForm("DeleteTutor", "Members",
new AjaxOptions
{
UpdateTargetId = "AdminBlock",
OnBegin = "isValidPleaseWait",
LoadingElementId = "PleaseWait"
},
new { name = "DeleteTutorForm", id = "DeleteTutorForm" }))
{
<input type="submit" value="Delete" />
@Html.Hidden("TutorName", username)
}
</td>
</tr>
}
Смертельная линия здесь:
@Html.Hidden("TutorName", username)
... и намеревается использовать TutorName в качестве параметра вашего действия. EG:
public virtual ActionResult DeleteTutor(string TutorName){...}
Если вы сделаете это, неприятным сюрпризом для вас будет то, что Html.Hidden ("TutorName", имя пользователя), как объясняет Дарин Димитров, будет отображать последнее значение POSTed. То есть, независимо от вашего цикла, ВСЕ элементы будут отображаться с именем TutorName последнего удаленного Tutor!
Смысл в синтаксисе Razor - заменить вызов @ Html.Hidden явным тегом ввода:
<input type="hidden" id="TutorName" name="TutorName" value='@username' />
Это работает как ожидалось.
Т.е.:
НИКОГДА, НИКОГДА НЕ ИСПОЛЬЗУЙТЕ Html. Спрятан, чтобы передать ПАРАМЕТР ВЕРНУТЬСЯ В ВАШИ ДЕЙСТВИЯ, КОГДА ВЫ ИСПОЛЬЗУЕТЕ НЕСКОЛЬКО ФОРМ В СЕТЕ !!!
Заключительная оговорка:
При создании скрытого входного тега вам необходимо включить и имя, и идентификатор, установить одно и то же значение, иначе во время написания (февраль 2011 г.) он не будет работать должным образом. Конечно, не в Google Chrome. Все, что вы получаете, это нулевой параметр, возвращаемый, если у вас есть только идентификатор и атрибут name.