2017-03-21 2 views
2

ViewModel - Customer가 있습니다. 이 내를 IEnumerable 모음이 :ViewModel의 IEnumerable 바인딩이 작동하지 않습니다.

public class Tag 
{ 
    public int TagNo{ get; set; } 
    public DateTime CreatedDate { get; set; } 
} 

I 출력 페이지에 태그 목록 - 함께 스칼라 고객 정보 - foreach는 사용 :

...output customer info.... 
<div class="col-md-9"> 
    @{ 
     foreach (var Tag in Model.Tags) 
     { 
      @Html.DisplayFor(x => Tag.TagNo); 
      <br /> 
     } 
    } 
</div> 

내가 태그를 숨기려고 시도하고를 모델 바인더에 대한 페이지의 목록 나는 데이터베이스를 다시 칠 필요가 없습니다 오류에 대한 있도록 :

:

@{ 
    int[] tagArray = Model.Tags.Select(x => x.TagNo).ToArray(); 

    for (int i = 0; i < Model.Tags.Count(); i++) 
    { 
     @Html.Hidden("Tags[" + i + "]", tagArray[i]) 
    } 
} 

이이 출력

<input id="Tags_0_" name="Tags[0]" type="hidden" value="21111111" /> 
etc 
나는 그래서 당신은 모델 바인더 바인딩 목록에 대한 이해 특정 형식 (위)를 배열을 사용할 수있는 말에 대한 다양한 질문을 보았다

- 예 : 그러나

Creating HiddenFor IEnumerable<String> in View

때 페이지에 오류가 있으며 디버거를 사용하여 게시물에 바인딩 된 내용을 볼 수 있습니다. 그러나 model.tags에는 3 개의 요소가있는 것으로 보입니다 - 모두 비어 있습니다.

@Html.Hidden("Tags[" + i + "].TagNo", tagArray[i]) 

을하지만 Customer.Tags 수집은 게시 후 비어 :

나는 또한이 시도했다.

내가 뭘 잘못하고 있니? 어떻게 모델 바인더가 볼 수 있도록 페이지의이 태그 목록을 숨길 수 있습니까?

+0

를 사용하여 강력한 형식의 헬퍼 -'@ Html.Hidden (m => m [내가] .Tags.TagNo)'(CreatedDate''저두 요) 그래서 당신은 생성 올바른 html. 하지만 왜이 작업을하고 있습니까? 필요할 경우 POST 메서드에서 컬렉션을 다시 가져옵니다. 여분의 HTML을 모두 생성하여 클라이언트에게 보낸 다음 변경 사항을 다시 원래대로 보내면 성능이 저하됩니다. 'Tags' 프라퍼티는'IList '이되어야합니다. –

+0

Thx - 모델 에러가 발생하면 데이터베이스를 다시 불러올 필요가 없습니다. 나는 명백한 것을 놓치고 있는가? – niico

+0

클라이언트 측 유효성 검사를 설정했다면 드물게 뷰를 반환해야합니다. 데이터베이스에서 다시 얻으십시오. –

답변

1

귀하의 모델 속성은 IEnumerable<Tag>이지만, int[]을 (를) 게시하는 행 다음을 참조하십시오.

당신이 내가 추천

@{ 
    int[] tagArray = Model.Tags.Select(x => x.TagNo).ToArray(); 

    for (int i = 0; i < Model.Tags.Count(); i++) 
    { 
     @Html.Hidden("Tags[" + i + "]", tagArray[i]) 
    } 
} 

@for (int i = 0; i < @Model.Tags.Count; i++) 
{ 
    <input id="[email protected](i)__TagNo" name="Tags[@i].TagNo" type="hidden" value="@Model.Tags[i].TagNo" /> 
} 

에 변경할 필요가 이러한 상황에 대한 편집기 템플릿을 사용하여

\ 조회수 \ 공유 \ EditorTemplates \ Tag.cshtml :

@model mvcTest.Models.Tag 
@Html.HiddenFor(a => a.TagNo) 

부모보기 :

@for (int i = 0; i < @Model.Tags.Count; i++) 
{ 
    @Html.EditorFor(a => a.Tags[i]) 
} 
+0

'EditorTemplate'을 사용할 때, 단지'@Html.EditorFor (a => a.태그)'- 루프가 필요 없음 - 메서드는'IEnumerable '을 받아들이고 컬렉션의 각 항목에 대해 올바른 html을 렌더링합니다. –

관련 문제