[asp.net-mvc] ASP.NET MVC 양식에서 확인란을 처리하는 방법은 무엇입니까?

주의 :이 질문은 9 세 이상입니다!

가장 좋은 방법은 최신 질문을 검색하거나 특정 버전의 MVC를 찾는 아래의 답변을 검색하는 것입니다. 여기서 많은 답변이 더 이상 사용되지 않습니다.

사용중인 버전에 맞는 답변을 찾으면 사용중인 MVC 버전이 답변에 포함되어 있는지 확인하십시오.
(원래 질문은 아래에서 시작합니다)


이것은 나에게 약간 기괴한 것처럼 보이지만 내가 알 수있는 한, 이것이 당신이하는 방법입니다.

개체 모음이 있으며 사용자가 하나 이상의 개체를 선택하기를 원합니다. 이것은 나에게 “체크 박스와 양식”이라고 말합니다. 내 객체에는 “선택된”개념이 없습니다 (wcf 호출을 직렬화 해제하여 생성 된 기본적인 POCO입니다). 그래서 나는 다음을 수행합니다.

public class SampleObject{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

보기에서 :

<%
    using (Html.BeginForm())
    {
%>
  <%foreach (var o in ViewData.Model) {%>
    <%=Html.CheckBox(o.Id)%>&nbsp;<%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

그리고 컨트롤러에서 이것이 사용자가 확인한 객체를 파악할 수있는 유일한 방법입니다.

public ActionResult ThisLooksWeird(FormCollection result)
{
  var winnars = from x in result.AllKeys
          where result[x] != "false"
          select x;
  // yadda
}

처음에는 이상하고 사용자가 확인한 항목의 경우 FormCollection의 값이 true가 아니라 “true false”로 표시됩니다.

분명히, 나는 무언가를 놓치고있다. 나는 이것이 html 양식 내에서 작동하는 컬렉션의 객체가 다음을 사용하여 업데이트된다는 생각을 염두에두고 작성되었다고 생각합니다.UpdateModel() 가 ModelBinder를 하거나 ModelBinder를 통해 .

그러나 내 객체는 이것을 위해 설정되지 않았습니다. 이것이 이것이 유일한 방법이라는 것을 의미합니까? 다른 방법이 있습니까?



답변

Html.CheckBox가 이상한 일을하고 있습니다. 결과 페이지에서 소스를 보면 <input type="hidden" />각 확인란과 함께 각 양식 요소에 대해 표시되는 “true false”값을 설명하는 내용이 표시됩니다.

방금 시도한 ASP.NET MVC 베타에서 작동하는 이것을 사용해보십시오.

Html.CheckBox ()를 사용하는 대신 이것을 뷰에 넣으십시오.

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    <input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
    <%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

확인란이 모두 selectedObjects이고value 각각의 체크 박스는 해당 개체의 GUID입니다.

그런 다음 다음 컨트롤러 작업 (또는 Response.Write () 대신 유용한 것을 수행하는 유사한 작업)에 게시하십시오.

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

이 예는 선택한 상자의 GUID를 작성합니다. ASP.NET MVC는 선택한 확인란의 GUID 값을 Guid[] selectedObjects매개 변수 로 매핑하고 Request.Form 컬렉션의 문자열을 인스턴스화 된 GUID 개체로 구문 분석합니다.


답변

HtmlHelper는 숨겨진 입력을 추가하여 컨트롤러에 확인되지 않은 상태를 알려줍니다. 올바른 상태를 확인하려면 다음을 수행하십시오.

bool bChecked = form[key].Contains("true");


답변

왜 그들이 왜 확인란과 같은 이름으로 숨겨진 필드를 넣었는지 궁금해하는 이유는 다음과 같습니다.

소스 코드의 주석 MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs

<input
type="hidden".../>
확인란을 추가 로 렌더링합니다 . 이 확인란은 선택하지 않은 확인란이 요청에 전송되지 않는 시나리오를 해결합니다. 숨겨진 입력을 보내면 요청이 제출되었을 때 해당 확인란이 페이지에 있음을 알 수 있습니다.

나는 컨트롤러 액션 메소드의 매개 변수에 바인딩하기 위해 이것을 알아야 할 것으로 생각합니다. 그런 다음 3 상태 부울을 가질 수 있습니다 (nullable bool 매개 변수에 바인딩 됨). 나는 그것을 시도하지 않았지만 그들이 한 일을 바라고 있습니다.


답변

또한 <label for="checkbox1">Checkbox 1</label>사람들은 레이블 자체뿐만 아니라 확인란 자체를 클릭 할 수 있기 때문에 사용해야 합니다. 또한 스타일 지정이 쉽고 IE에서는 페이지 컨트롤을 탭하면 강조 표시됩니다.

<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>

이것은 단지 ‘오 내가 할 수있는’일이 아닙니다. 사용자 경험이 크게 향상되었습니다. 모든 사용자가 아는 것은 아니지만 많은 사용자는 레이블을 클릭 할 수 있습니다.


답변

이 답변 중 내장 MVC 기능을 사용하지 않은 것에 놀랐습니다.

나는 이것에 관한 블로그 게시물을 여기 에 썼다. 실제로 라벨을 체크 박스에 연결한다. EditorTemplate 폴더를 사용하여 깔끔하고 모듈 방식으로이 작업을 수행했습니다.

EditorTemplate 폴더에 다음과 같은 새 파일이 생깁니다.

@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)

실제보기 에서이 코드를 반복 할 필요가 없습니다. 단순히 한 줄의 코드 :

@Html.EditorFor(x => ViewData.Model)

자세한 내용은 내 블로그 게시물 을 방문 하십시오.


답변

여기 내가 한 일이 있습니다.

전망:


<input type="checkbox" name="applyChanges" />

제어 장치:


var checkBox = Request.Form["applyChanges"];

if (checkBox == "on")
{
...
}

어떤 경우에는 Html. * 도우미 메서드가 그다지 유용하지 않다는 것을 알았고 평범한 오래된 HTML로 처리하는 것이 좋습니다. 이것은 그들 중 하나이고, 떠오르는 다른 하나는 라디오 버튼입니다.

편집 : 이것은 미리보기 5에 있으며, 분명히 버전간에 YMMV입니다.


답변

첫 번째 값만 읽는 것으로 보이므로 확인란을 선택하면 “true”이고 숨겨진 값만 포함 된 경우 “false”입니다. 이것은 다음과 같은 코드로 쉽게 가져올 수 있습니다.

model.Property = collection["ElementId"].ToLower().StartsWith("true");