2011-11-14 5 views
14

내가 체크 박스가 상당히 정직 페이지를 만든 다음 URL을 두 번 MyCheckBox 값으로 채워집니다MV3 중복 쿼리 문자열 값

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Get)) 
{ 
    @Html.CheckBoxFor(x => x.MyCheckBox) 
    <input type="submit" value="Go!" />  
} 

을!? 따라서 :

MyAction?MyCheckBox=true&MyCheckBox=false 

이 값은 확인란이 true 일 때만 값을 복제합니다. false로 설정하면 쿼리 문자열에 한 번만 표시됩니다.

위의 코드는 몇 개의 드롭 다운과 제대로 작동하는 양식의 텍스트 상자가 있기 때문에 단순화되었습니다. 나는이 질문에서 빠뜨린 코드에 대해 특별한 것이 없다고 생각합니다.

쿼리 문자열 매개 변수가 복제되는 것과 비슷한 문제가있는 사람이 있습니까?

답변

14

피드백 보내기 현재 상태이 동작은 확인란 컨트롤의 의도적입니다. 선택하지 않으면 표준 HTML 체크 상자 컨트롤은 값을 전달하지 않습니다. 이것은 직관적이지 않습니다. 대신, ASP.Net 확인란 컨트롤은 2 개의 요소, 표시되는 표준 컨트롤 및 'False'값을 가진 숨겨진 컨트롤을 가지고 있습니다.

따라서 체크 박스를 선택하지 않으면 전달 된 값은 False입니다.
선택하면 TrueFalse의 두 값이 있습니다. 그러므로 당신은 당신의 코드에서 유효성을 확인하려면 다음 코드를 사용해야합니다

bool checkboxChecked = Request.QueryString["MyCheckBox"].Contains("True"); 
+2

재미있는 내용이지만 URL의 깔끔함을 고집한다면? 그것은 매개 변수를 두 번 가지고있는 것이 조금 어색해 보입니다!? – pfeds

+0

보기 흉한 것 일지 모르지만 사용자층의 99 %는 그것을 이해하지 못합니다. URL의 깔끔함을 정말로 염려한다면 게시를 통해 데이터를 전달하고 양식의 특정 경로를 만들 수 있습니다. –

+0

네, 맞습니다. 나는 그것을 GET으로 남겨두고 그렇게 pedantic하지 않을 것이다. 많은 분들께 감사드립니다. Rory. – pfeds

3

허용 대답은 MVC의 행동이 오해의 소지가 최근 개발에 내 경우 그러나 올바른 것입니다.

MVC Html.CheckBox(...)Html.CheckBoxFor(...)은 확인란 컨트롤과 동일한 ID로 'type = hidden'의 추가 입력을 생성하므로 중복 된 URL 매개 변수가 생성됩니다. 나는 단순히 다음과 같이 마크 업이 원하는 포함하여이 문제를 해결 가지고 : 값 검사가 캡슐화되도록 도우미가 MVC 코드 대신 사용할 UPIN

@if(checkTrue){ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox" checked="checked"> 
}else{ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox"> 
} 

더 나은 포장 될 것이다.

내 컨트롤러의 컨트롤러는 동일한 컨트롤러 범위 내에서 탐색하기 위해 클릭 할 때 (예 : 페이징/필터링 컨트롤) 상태를 유지하기 위해 도우미를 사용하여 폼 주입과 링크 주입을 모두 사용하는 쿼리 매개 변수 세트를 유지합니다. 이 기능의 결과로 표준 MVC 도우미가 사용되는 경우 확인란 요소는 항상 false로 다시 설정됩니다. 그것은 내가 알아 차리고이 버그에 많은 시간을 낭비하지 않은 좋은 일입니다. 내 모델에서

+3

메모가 정확하지 않습니다. ASP.NET MVC는 CheckBoxFor 헬퍼를 사용할 때 _hidden_이 아닌 _text_ 유형의 추가 입력을 생성합니다. http://stackoverflow.com/questions/2697299/asp-net-mvc-why-is-html-checkbox-generating-an-additional-hidden-input – janv8000

+0

@ janv8000을 참조하십시오. 맞습니다. 제 실수를 고쳤습니다. – kas

1

, 정말 같은 체크 박스의 컬렉션을했다 :

제대로 바인딩 할 모든 것을 얻기 위하여
public class PrerequisitesViewModel 
{ 
    public List<StudentPrerequisiteStatusViewModel> PrerequisiteStatuses { get; set; } 
} 

public class StudentPrerequisiteStatusViewModel 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public bool IsSelected { get; set; } 
} 

, 실제로 쿼리 문자열의 값을 변환하고 다음과 같이 수동으로 분석했다 코드 :

// fix for how MVC binds checkboxes... it send "true,false" instead of just true, so we need to just get the true 
for (int i = 0; i < model.PrerequisiteStatuses.Count(); i++) 
{ 
    model.PrerequisiteStatuses[i].IsSelected = bool.Parse((Request.QueryString[$"PrerequisiteStatuses[{i}].IsSelected"] ?? "false").Split(',')[0]); 
} 

아아, 작동하지만, 이것이 MVC에서 필요하다고 생각할 수 없습니다! 바라기를, 누군가는 더 나은 해결책을 알고 있습니다.

+0

동의합니다. MVC에서는 불필요합니다. 활성 체크 박스의 구분 된리스트를 갖는 쿼리 스트링은 예를 들어, mycheckboxlist = 1,5,6,10 – andrew