유형 목록의 컨트롤러 동작 매개 변수에 대한 모델 바인딩 포스트 백 데이터
-
18-09-2019 - |
문제
유형의 강력한 유형보기가 있습니다
List<List<MyViewModelClass>>
외부 목록에는 항상 두 개의 목록이 있습니다 List<MyViewModelClass>
. 두 개의 외부 목록 각각에 대해 확인란 그룹을 표시하려고합니다. 각 세트에는 임의의 선택이있을 수 있습니다.
내보기 모델 클래스는 다음과 비슷해 보입니다.
public class MyViewModelClass
{
public Area Area { get; set; }
public bool IsGeneric { get; set; }
public string Code { get; set; }
public bool IsChecked { get; set; }
}
따라서 최종보기는 다음과 같습니다.
적용되는 것을 선택하십시오 :
첫 번째 선택 세트 :
- 엑스 옵션 1
- 엑스 옵션 2
- 엑스 옵션 3
- 등.
두 번째 선택 세트 :
- 엑스 두 번째 옵션 1
- 엑스 두 번째 옵션 2
- 엑스 두 번째 옵션 3
- 엑스 두 번째 옵션 4
- 등.
확인란이 표시되어야합니다 MyViewModelClass.Area.Name
, 그리고 그들의 가치는 관련되어야합니다 MyViewModelClass.Area.Id
. 확인 된 상태는 물론 관련이 있습니다 MyViewModel.IsChecked
.
의문
어떻게 사용해야하는지 궁금합니다 Html.CheckBox()
또는 Html.CheckBoxFor()
내 체크 박스를 표시 할 도우미? 물론이 값을 포스트 백에서 서버로 가져와야합니다.
컨트롤러 조치를 취하고 싶습니다.
public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
// process data
}
public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
// process data
}
일을 더 간단하게 만들면 다음과 같은 별도의보기 모델 유형을 만들 수 있습니다.
public class Options
{
public List<MyViewModelClass> First { get; set; }
public List<MyViewModelClass> Second { get; set; }
}
컨트롤러 액션의 첫 번째 버전을 다음과 같이 변경할뿐만 아니라 다음과 같습니다.
public ActionResult ConsumeSelections(Options data)
{
// process data
}
해결책 2
해결책
이것은 전혀 복잡하지 않다는 것이 밝혀졌습니다. 당신이해야 할 일은 컨트롤을 적절하게 이름을 지정하면 모든 것이 함께 묶여 있습니다. 그래서. 당신의 컨트롤이 무엇이든, 그들은 항상 다음과 같이 명명되어야합니다.
name="first[0].propName"
name="first[1].propName"
name="first[2].propName"
name="first[3].propName"
...
// or
name="first[0].data[0].property"
name="first[0].data[1].property"
name="first[0].data[2].property"
...
name="first[1].data[0].property"
name="first[1].data[1].property"
...
이 모든 것이 묶일 것입니다 List<SomeType> first
컨트롤러 동작 매개 변수 (두 번째는 컬렉션 내부에 또 다른 컬렉션이 있습니다).
매우 중요한 메모
JavaScript를 사용하여 이러한 컨트롤을 동적으로 추가/제거하는 경우 인덱스가 0부터 연속적이며 간격이 없는지 확인해야합니다. 그리고 컬렉션에 동적 수의 요소가있는 멋진 작업 앱이 있습니다.
당신은 그것에 대해 읽을 수 있습니다 내 블로그 게시물 또한.
다른 팁
일반적으로 나는 내가 만들고 싶은보기를 "모델"하는 유형 (모델)을 만듭니다. 즉
public class FooViewModel
{
public List<Option> General { get; set; }
public List<Option> Others { get; set; }
//Some Methods and other properties
}
public FooController :...
{
private FooViewModel fooViewModel = new FooViewModel();
}
편집 : 살펴보십시오 이 게시물, 정확히 당신이 원하는 것입니다!