2013-04-22 3 views
3

현재 단일보기에서 여러 라디오 버튼 세트를 사용하는 MVC 응용 프로그램에서 작업하고 있습니다.단일보기에서 RadioButton을 그룹화하고 양식 데이터를 올바르게 게시하기

보기를 다시 게시 할 때 컨트롤러의 포스트 백 메서드가 각 라디오 단추 그룹에 대해 선택된 옵션을 전달할 수 있도록 폼 데이터를 자동으로 구문 분석하고 입력해야합니다.

모델

public class SurveyViewModel { 

    public List<SurveyQuestion> Questions { get; set; } 

} 

public class SurveyQuestion 

{ 

    public string Question { get; set; } 

    public IEnumerable<SelectListItem> Options { get; set; } 

    public int Answer { get; set; } 

} 

public class Option 

{ 
    public int Value { get; set; } 

    public string Text { get; set; } 

} 

컨트롤러

public ActionResult Survey() 

    { 
     List<string> questions = new List<string> { "Question 1", "Question 2", "Question 3" }; 



     SurveyViewModel model = new SurveyViewModel { 

      Questions = new List<SurveyQuestion>() 

     }; 



     foreach (string question in questions) 

     { 

      List<Option> list = new List<Option>(); 

      list.Add(new Option() { Value = 1, Text = "Answer 1" }); 

      list.Add(new Option() { Value = 2, Text = "Answer 2" }); 

      list.Add(new Option() { Value = 3, Text = "Answer 3" }); 

      SelectList sl = new SelectList(list, "Value", "Text"); 



      model.Questions.Add(new SurveyQuestion { 

       Question = question, 

       Answer = 1, // TODO: Get this from DB 

       Options = sl 

      }); 

     } 

     return View(model); 

    } 

보기

: 여기

는 점을 설명하기 위해 몇 가지 예제 코드 우리가 표준 MVC (아무 확장)을 고수한다면
@foreach (SurveyQuestion question in Model.Questions) 

    { 
     <p>@question.Question</p> 

     @Html.RadioButtonForSelectList(m => question.Answer, question.Options) 

    } 

도우미

http://jonlanceley.blogspot.co.uk/2011/06/mvc3-radiobuttonlist-helper.html

에서, Html.RadioButtonFor 도우미 [0] 옵션의 명명 규칙을 반복 그룹을 라디오 버튼 출력 끝, 옵션 [1], 옵션 [2] 등.

이렇게하면 모든 그룹의 첫 번째 옵션이 그룹화되고, 두 번째 옵션이 그룹화됩니다.

또 다른 방법은 컨트롤러의 포스트 백 작업에서 현재 요청 양식 데이터를 검사하고 수동으로 구문 분석하는 것입니다.하지만 입력 데이터를 입력 된 매개 변수로 자동 변환하는 MVC의 기능을 활용하기를 원했습니다. 이걸 직접해라.

는 제대로 컬렉션의 각 항목을 결합하기 위해 올바른 마크 업을 쓸 수 없습니다 모델 바인더로 컬렉션에 대한 foreach 루프를 사용하지 마십시오 당신의 도움이

답변

2

주셔서 감사합니다. 당신은 forloop을 사용하여 작성된 마크 업을 검사 할 수 있습니다

for (var i = 0; i < Model.Questions.Count(); i++) 
{ 
    <p>@Model.Questions[i].Question</p> 

    @Html.RadioButtonForSelectList(m => Model.Questions[i].Answer, Model.Questions[i].Options) 
} 

: 당신은 for-loop를 사용해야합니다. 이제 각 질문의 색인이 생성되고 (예 : Questions[0].Answer, Questions[1].Answer 등) 모델 바인더가 제대로 작업을 수행 할 수 있습니다. radiobuttonlist 도우미가 같은 이름의 옵션 (예 : question.Answer)을 작성하므로 현재 코드에서 작동하지 않을 것입니다. 따라서 모든 옵션은 하나의 그룹으로 취급됩니다.

+0

Brilliant! 그것은 긴 두통, 고마워 치료! – ComethTheNerd

+0

긴 두통을 고치는 것이 기쁘다;) –

관련 문제