2014-02-08 7 views
7

보기에서 컨트롤러로 개체의 목록을 전달할 때 문제가 있습니다. 목록은 항상 null입니다. 어떻게해야합니까?보기에서 컨트롤러로 목록을 전달하는 방법

내 모델 :

public class ImageModel 
{ 
    public int id { get; set; } 
    public string url { get; set; } 
    public bool delete { get; set; } 
} 

public class SchoolImages 
{ 
    public Nullable<int> schoolid { get; set; } 
    public IList<ImageModel> images; 
} 

뷰 : 나는 삭제를 클릭하면, SchoolImages 컨트롤러에 전달

@model SchoolAppManager.Models.SchoolImages 

@using (Html.BeginForm("DeleteImages", "Images")) 
{ 

    @Html.HiddenFor(x => x.schoolid) 
    <table> 
    @for (int i = 0; i < Model.images.Count(); i += 4) { 

     <tr> 
      <td> 
       <img src="@Url.Content(Model.images[i].url)" width="50%" /> 
       <br /> 
       @Html.CheckBoxFor(x => x.images[i].delete) 
       @Html.HiddenFor(x => x.images[i].id) 
      </td> 
      <td> 
       @if (i + 1 < Model.images.Count()) 
       { 
        <img src="@Url.Content(Model.images[i + 1].url)" width="50%" /> 
        <br /> 
        @Html.CheckBoxFor(x => x.images[i + 1].delete) 
        @Html.HiddenFor(x => x.images[i + 1].id) 
       } 
      </td> 
      <td> 
       @if (i + 2 < Model.images.Count()) 
       { 
        <img src="@Url.Content(Model.images[i + 2].url)" width="50%" /> 
        <br /> 
        @Html.CheckBoxFor(x => x.images[i + 2].delete) 
        @Html.HiddenFor(x => x.images[i + 2].id) 
       } 
      </td> 
      <td> 
       @if (i + 3 < Model.images.Count()) 
       { 
        <img src="@Url.Content(Model.images[i + 3].url)" width="50%" /> 
        <br /> 
        @Html.CheckBoxFor(x => x.images[i + 3].delete) 
        @Html.HiddenFor(x => x.images[i + 3].id) 
       } 
      </td> 
     </tr> 
    } 
    </table> 

    <input type="submit" value="delete" /> 
} 

, SchoolImages.schoolId 컨트롤러의 값을 가지고, 그러나, SchoolImages.images은 null입니다. 컨트롤러에 SchoolImages.images을 어떻게 전달할 수 있습니까?

+0

컨트롤러에 목록을 전달하는 유일한 방법은 jquery로 빌드하고 아약스 호출을 통해 전달하는 것입니다. 가능한 경우 ID를 전달하고 컨트롤러에서 목록을 다시 작성하는 것이 훨씬 더 쉽습니다. –

답변

6

기본 모델 바인더는 필드와 함께 작동, 그래서 images에게 재산하지 않습니다

public IList<ImageModel> images { get; set; } 
+0

어리석은 실수, @Zabavsky 감사합니다. 시간을 많이 절약 할 수 있습니다! – Fuli

1

난 당신이 모델에 복잡한 유형을 바인딩 문제가있는 것입니다 생각합니다. 당신이 그 일을하지 않으면. 여기에 대체 방법이 있습니다.

같은 이름과 다른 값을 가진 확인란이 여러 개 있습니다. 당신은 FormCollection을 취하는 메소드에 그것을 게시 할 수 있습니다.

public ActionResult Test(FormCollection collection) 
{ 
    string results = collection["Blanks"]; 
} 

이렇게하면 쉼표로 구분 된 값 목록 (또는 확인란을 선택하지 않은 경우 null)이 표시됩니다. 당신을 제공

@using (Html.BeginForm("Test","Home")) 
{ 
    @Html.CheckBox("Blanks[0]", false); 
    @Html.CheckBox("Blanks[1]", false); 
    @Html.CheckBox("Blanks[2]", false); 

    <input type="submit" value="Submit" /> 
} 

: 서버에 배열로 사용할 수있는 값이있는 경우

또는, 당신은 당신이 이런 일을 할 수있는 의미들이 배열 값에 따라 체크 박스의 이름을 줄 수 테스트 방법 부울 배열 :

공개 ActionResult 테스트 (BOOL [] 공백) {}

+0

덕분에, 당신의 방법은 매우 유용하지만, @ Zabavsky의 대답은 트릭을 했어! – Fuli

0

모델 "SchoolImages"를 변경 시도; IList <> 대신 배열을 사용하십시오.

0

기본 모델 바인더가 초기화 방법을 알지 못하기 때문에 null입니다. 당신의 분야의 이미지를 변경 속성을하고이 같은 생성자를 추가합니다 : 그것은 작동해야

public class SchoolImages 
{ 
    public SchoolImages() 
    { 
     images = new List<ImageModel>(); 
    } 
    public Nullable<int> schoolid { get; set; } 
    public IList<ImageModel> images { get; set; } 
} 

.

관련 문제