2017-11-12 1 views
0

나는 객체가 있습니다. List<ObjectB> ObjectB에는 몇 가지 속성이 있습니다. Id, Mandatory, NameMVC, 부분 부분 모델

그래서 나는 뷰 모델 (ObjectA)을 반환 내 면도칼이있다 : I는 입력 매개 변수로 시도

@model ObjectA 
<div> 
<div>@Html.HiddenFor(m => ObjectA.ObjectC.ID) 
    <dl class="dl-horizontal"> 
     <dt> 
      @Html.DisplayNameFor(model => ObjectA.ObjectC.Name) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => ObjectA.ObjectC.Name) 
     </dd> 
    </dl></div> 
    // display stuff from objectA 
    @using (Html.BeginForm()) 
    { 
     foreach (var ft in ObjectA.ObjectB) 
     { 
      @Html.HiddenFor(c => ft.ID) 
      <div class="row"> 
       <div class="col"> 
       @if (ft.Mandatory) 
       { 
        @Html.CheckBoxFor(c => ft.Mandatory, new { id = ft.ID, disabled = "disabled" }) 
        @Html.HiddenFor(c => ft.Mandatory) 
       } 
       else 
       { 
        @Html.CheckBoxFor(c => ft.Mandatory, new { id = ft.ID }) 
       } 
       </div> 
     </div> 
    </div> 
</div> 

내 컨트롤러에서 : List<ObjectB> items 하지만 null입니다 . 이제 나는 내가 시도한 FormCollection을 시도 할 수 있다는 것을 알았고 form.Get("ft.id")에는 objectB 목록에있는 항목의 수가 있다는 것을 알았습니다. 의무적으로 동일합니다. 하지만 강하게 입력하고 싶습니다. 어느 : 유형 B의 모든 유형 objectB의 하위 객체를 IEnumerable

2 목록 /와

1 대상물 (A).

아마도 작은 것이지만 지금은 볼 수 없습니다.

편집 내 모델 :

public class ObjectA : BaseViewModel 
{ 
    public ObjectC DisplayOnly { get; internal set; } 

    public List<ObjectB> Features { get; set; } 
} 

내보기 : (위 참조) 내 컨트롤러 :

현재 코드
[Route("Details/{id:int}")] 
[HttpPost] 
public ActionResult Details(ObjectA vm) 
{ 
    if (ModelState.IsValid) 
    { 
     int hid = Convert.ToInt32(RouteData.Values["id"]); 
    } 
} 
+0

모델을 'ObjectA'라고 게시하면 Html 레벨에서 눈썹에 대한 이유가 표시되지 않습니다. 어쨌든 HTML 폼에있는 모든 필드 만 보낼 수 있습니다. 따라서 컨트롤러에'List '을 입력으로 삼아서는 안됩니다. – derloopkat

+0

'ObjectA'의 모든 소품이 표시됩니다. 그리고 ObjectB는 일종의 확장 된 선택 목록입니다. ID, 필수, 이름, 가격, 설명 등입니다. 따라서 objectB의 변경 만 필요합니다. 그러나 모든 것을 가진 완전한 대상 A 역시 괜찮습니다. 그것을 시도하고 null이었다. –

답변

1

, 그것은 이름 속성을 가진 체크 박스의 입력 요소를 렌더링 값은 ft.Mandatory으로 설정됩니다. 양식을 제출할 때 모델 바인더는보기 모델 특성 이름/특성 계층 구조와 일치하지 않기 때문에이 위치를 어디로 매핑할지 모릅니다. 모델 바인딩이 작동하려면 입력 이름이 매개 변수 클래스의 속성 이름과 일치해야합니다.

편집기 템플릿을 사용하여이 사용 사례를 처리 할 수 ​​있습니다.

~/Views/Shared 또는 ~/Views/YourControllerNameEditorTemplates이라는 폴더를 만들고 새보기를 만들고이 확인란에 필요한 데이터를 나타내는 데 사용하는 클래스 이름과 동일한 이름을 지정하십시오. 귀하의 경우에는 ObjectB.cshtml

이보기를 강력하게 OptionB으로 입력하고 확인란과 숨겨진 입력을 렌더링하십시오. 양식이 제출 될 때

@model OptionB 
<div> 
    @Html.CheckBoxFor(x => x.Mandatory) 
    @Html.HiddenFor(c => c.Id) 
</div> 

기억

브라우저를 사용할 수 폼 요소의 값을 전송하지 않습니다.

이제 기본보기에서 EditorFor 도우미 메서드를 호출 할 수 있습니다.

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(a=>a.OptionBList) 
    <button type="submit">Send form</button> 
} 

이 체크 박스

이제
Options[0].Mandatory 
Options[1].Mandatory 
Options[2].Mandatory 

당신은 단순히 OptionA을 사용할 수에 대한 숨겨진 입력과 함께 (당신이 OptionBList 3 개 항목이 가정 )이 같은 이름의 속성 값의 체크 박스를 렌더링 HttpPost 액션 메소드의 매개 변수

+0

하지만 체크 된 모든 체크 박스가있는 목록을 받고 싶습니다. 일부는 필수이므로 기본적으로 선택되고 읽기 전용/비활성화로 설정됩니다. 그러나 나는 그것들을 나의 컨트롤러 행동에도 필요로한다. –

+0

이 옵션은 모든 체크 박스를 제공합니다 (OptionBList 콜렉션의 각 항목에 하나씩). 대답에 대한 내 업데이 트를 참조하십시오. 비활성화 된 체크 박스는 제출되지 않습니다. – Shyju

+1

편집기 템플릿이 작동하는 것 같습니다. 입력 매개 변수없이 모델에 생성자를 추가해야했습니다. 하지만 지금 게시하고 목록이 null이 아닙니다. –