ASP.NET MVC: ukryta wartość pola nie jest renderowana przy użyciu HtmlHelper.Ukryty
Coś dziwnego dzieje się z moją aplikacją:
Mam następującą właściwość:
public int? StakeholderId { get; set; }
Jest renderowany w widoku częściowym w następujący sposób:
<%= Html.Hidden("StakeholderId", Model.StakeholderId) %>
Formularz jest przesyłany, a odpowiednie działanie kontrolera generuje id i aktualizuje model, zanim zwróci ten sam widok ze zaktualizowanym modelem
Problem, którego doświadczam polega na tym, że ukryte pole nie ma niczego w atrybutie" value " renderowanym za drugim razem / align = "left" /
Jeśli po prostu wyprowadzę wartość samodzielnie, pojawi się ona na stronie, więc mam ją do renderowania wartości, wykonując to:
<input type="hidden" id="StakeholderId" name="stakeholderId" value="<%: Model.StakeholderId %>" />
Ale to dość dziwne, że pomocnik nie odbiera zaktualizowanej wartości?
(używam jQuery do przesyłania formularzy i renderowania wyników akcji do div, ale sprawdziłem i html, który odzyskuję, jest już zły, zanim jQuery coś z nim zrobi, więc nie sądzę, że ma to wiele wspólnego z anything)
UPDATE
Od tego czasu odkryłem, że mogę również wyczyścić odpowiedni klucz ModelState, zanim moja akcja kontrolera zwróci częściowy widok.
2 answers
Helper najpierw wyszukuje Opublikowane wartości i używa ich. Gdy publikujesz formularz, odbierze on starą wartość identyfikatora. Twoje obejście jest prawidłowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 08:52:17
Dodatek: wiele formularzy HTML, np. w siatce
Jako dodatek do tego zagadnienia, jedną rzeczą, na którą należy bardzo uważać, jest posiadanie wielu formularzy na tej samej stronie, np. w siatce, powiedzmy generowanej za pomocą Ajax.BeginForm.
Możesz pokusić się o napisanie czegoś w stylu:
@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>
}
Zabójcza linia to:
@Html.Hidden("TutorName", username)
... i zamierzam użyć TutorName jako parametru Twojej akcji. EG:
public virtual ActionResult DeleteTutor(string TutorName){...}
Jeśli to zrobisz, paskudną niespodzianką, na którą czekasz, jest to, że Html.Hidden ("TutorName", username), jak wyjaśnia Darin Dimitrov, wyrenderuje Ostatnio dodaną wartość. Niezależnie od pętli wszystkie elementy będą renderowane z nazwą tutora ostatniego usuniętego tutora!
Słowo wokół, w składni Razor ma zastąpić @Html.Ukryte wywołanie z wyraźnym znacznikiem wejściowym:
<input type="hidden" id="TutorName" name="TutorName" value='@username' />
To działa zgodnie z oczekiwaniami.
Ie:
Nigdy, przenigdy nie używaj Html.Ukryte, aby przekazać parametr z powrotem do swoich działań, gdy używasz wielu formularzy w / Align = "left" / !!
Ostatnie Zastrzeżenie:
Podczas konstruowania ukrytego znacznika wejściowego, musisz podać zarówno nazwę, jak i id, ustawione na tę samą wartość, w przeciwnym razie, w momencie pisania (luty 2011) nie będzie działać poprawnie. Na pewno nie w Google Chrome. Wszystko, co otrzymujesz, to parametr null zwracany, jeśli masz tylko atrybut id i No name.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 10:53:15