program tip

ASP.NET MVC : 숨겨진 필드 값은 HtmlHelper.Hidden을 사용하여 렌더링되지 않습니다.

radiobox 2020. 11. 2. 07:49
반응형

ASP.NET MVC : 숨겨진 필드 값은 HtmlHelper.Hidden을 사용하여 렌더링되지 않습니다.


내 앱에서 꽤 이상한 일이 일어나고 있습니다.

내 ViewModel에 다음 속성이 있습니다.

public int? StakeholderId { get; set; }

다음과 같이 부분 보기로 렌더링 됩니다.

<%= Html.Hidden("StakeholderId", Model.StakeholderId) %>

양식이 제출되고 관련 컨트롤러 작업이 ID를 생성하고 모델을 업데이트 한 후 업데이트 된 모델로 동일한보기를 반환합니다.

내가 겪고있는 문제는 StakeholderId가 이제 값을 가지고 있어도 숨겨진 필드의 "value"속성에 두 번째로 렌더링 된 항목이 없다는 것입니다.

값을 자체적으로 출력하면 페이지에 표시되므로 다음을 수행하여 값을 렌더링 할 수 있습니다.

<input type="hidden" id="StakeholderId" name="stakeholderId" value="<%: Model.StakeholderId %>" />

하지만 도우미가 업데이트 된 값을 선택하지 않는 것이 이상합니다.

(저는 jQuery를 사용하여 양식을 제출하고 작업 결과를 div로 렌더링하지만 jQuery가 작업을 수행하기 전에 확인한 HTML이 이미 잘못되었으므로 그와 관련이 있다고 생각하지 않습니다. 아무것도)

최신 정보

이후 컨트롤러 작업이 부분보기를 반환하기 전에 관련 ModelState 키를 지울 수도 있음을 발견했습니다.


도우미는 먼저 POST 된 값을 찾아 사용합니다. 양식을 게시 할 때 ID의 이전 값을 선택합니다. 해결 방법이 정확합니다.


부록 : 여러 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을 액션의 매개 변수로 사용하려고합니다. 예 :

public virtual ActionResult DeleteTutor(string TutorName){...}

이렇게하면 Html.Hidden ( "TutorName", username)이 Darin Dimitrov가 설명하는 것처럼 마지막 POST 된 값을 렌더링한다는 점이 놀랍습니다. 즉, 루프에 관계없이 모든 항목은 마지막으로 삭제 된 교사의 TutorName으로 렌더링됩니다!

Razor 구문에서 주변 단어는 @ Html.Hidden 호출을 명시 적 입력 태그로 바꾸는 것입니다.

<input type="hidden" id="TutorName" name="TutorName" value='@username' />

이것은 예상대로 작동합니다.

즉 :

그리드에서 여러 형식을 사용할 때 Html.Hidden을 사용하여 작업에 매개 변수를 다시 전달하지 마십시오!

마지막 경고 :

When constructing your hidden input tag, you need to include both name and id, set to the same value, otherwise, at the time of writing (Feb 2011) it won't work properly. Certainly not in Google Chrome. All you get is a null parameter returned if you only have an id and no name attribute.

참고URL : https://stackoverflow.com/questions/2019131/asp-net-mvc-hidden-field-value-does-not-get-rendered-using-htmlhelper-hidden

반응형