2013-05-21 7 views
1

체크 박스를 기반으로 정수 배열을 게시하려고 시도하는 곳에서 이상한 (나에게) 문제가 발생합니다. 값이 순서대로 게시되지 않으면 모델 바인더가 예상대로 작동하지 않는 것 같습니다.MVC에서 번호가 매겨진 배열 배열

나는 매우 간단한 작업에 대해이 문제를 재현 할 수

public ActionResult Debug(string[] Unassigned) 
    { 
     return RedirectToAction("Index", new { id = 7 }); 
    } 

이 예제하지 다음 값이 게시 (직접 실행 창을 통해에 복사) 할 때이 될 것입니다 작업. 값이 순서대로 전달되면 나는이 (Unassigned[3]가 게시되지 Unassigned[2]으로 구속되지 않습니다 작동 값 8, 6

? Request.Form.AllKeys 
{string[4]} 
[0]: "__RequestVerificationToken" 
[1]: "LoginId" 
[2]: "Unassigned[1]" 
[3]: "Unassigned[3]" 
? Request.Form["Unassigned[1]"] 
"8" 
? Request.Form["Unassigned[3]"] 
"6" 
? Unassigned 
null 

을 가지고 할당되지 않은 기대.

? Request.Form.AllKeys 
{string[5]} 
[0]: "__RequestVerificationToken" 
[1]: "LoginId" 
[2]: "Unassigned[0]" 
[3]: "Unassigned[1]" 
[4]: "Unassigned[3]" 
? Request.Form["Unassigned[0]"] 
"2" 
? Request.Form["Unassigned[1]"] 
"8" 
? Request.Form["Unassigned[3]"] 
"6" 
? Unassigned 
{string[2]} 
[0]: "2" 
[1]: "8" 

마이너스 서식, 내 HTML이 무엇을 잘못하고 있어요 select is not broken 감안할 때이

<input type="checkbox" name="Unassigned[0]" value="2"> 
<input type="checkbox" name="Unassigned[1]" value="8"> 
<input type="checkbox" name="Unassigned[2]" value="7"> 
<input type="checkbox" name="Unassigned[3]" value="6"> 
<input type="checkbox" name="Unassigned[4]" value="5"> 
<input type="checkbox" name="Unassigned[5]" value="9"> 
<input type="checkbox" name="Unassigned[6]" value="4"> 
<input type="checkbox" name="Unassigned[7]" value="3"> 
<input type="checkbox" name="Unassigned[8]" value="1"> 

처럼 보인다?

+1

을, 배열 /리스트와 관련하여 기본 모델 바인더가 작동하는 방식 일뿐입니다. 일치하는 색인 ​​+ 1을 찾을 수없는 순간에 종료됩니다. – rossisdead

답변

3

select가 깨지지 않았다고 가정하면, 잘못된 것은 무엇입니까? 당신이 당신의 인덱스에 구멍을 가지고 있기 때문에

당신은 convention for binding to a list을 존중하지 않습니다. Guids와 같이 비 순차 인덱스를 사용할 수 있습니다. Phil Haacks 블로그 게시물을 살펴 보겠습니다. 그는 전체 섹션을 가지고 있습니다.

보기 모델을 사용하는 것이 좋습니다. 그래서 가서 쓰기를 :

public class ItemViewModel 
{ 
    public string Id { get; set; } 
    public bool Selected { get; set; } 
} 

을 한 다음 컨트롤러 수 :

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new ItemViewModel { Id = "2" }, 
      new ItemViewModel { Id = "8" }, 
      new ItemViewModel { Id = "7" }, 
      new ItemViewModel { Id = "6" }, 
      new ItemViewModel { Id = "5" }, 
      new ItemViewModel { Id = "4" }, 
      new ItemViewModel { Id = "3" }, 
      new ItemViewModel { Id = "1" }, 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ItemViewModel[] model) 
    { 
     // everything will be correctly bound here 
    } 
} 

와 상응하는 강력한 형식의보기 : 당신이 잘못 작업을 수행하지 않는

@model ItemViewModel[] 
@using (Html.BeginForm()) 
{ 
    for (var i = 0; i < Model.Length; i++) 
    { 
     Html.HiddenFor(x => x[i].Id) 
     Html.CheckBoxFor(x => x[i].Selected) 
    } 

    <button type="submit">OK</button> 
}