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.

Author: Alex, 2010-01-07

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.

 59
Author: Darin Dimitrov,
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.

 33
Author: awrigley,
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