2012-08-22 1 views
4

내가 현재 가지고있는 정의 된 객체 Tag 다음과 : 이제반환 목록 <T> 3

public class Tag 
{ 
    public string Name { get; set; } 
} 

이 내가 같은 정의 있어요 모델의 컬렉션 속성은 다음과 같습니다

내보기에서
public class MyModel 
{ 
    public string Name { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

나는 다음과 같은 코드가 있습니다

@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(m => m.Name) 
     @Html.TextBoxFor(m => m.Name) 
    </div> 

    <div> 
     <!-- 
     Here I'd like a collection of checkbox inputs, where the selected names 
     get passed back to my controller via the IList<Tag> collection 
     --> 
    </div> 

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

내 항목의 IList 컬렉션을 통해 선택한 항목을 체크 박스 그룹 (설명에 지정)에 반환하는 방법은 무엇입니까?

답변

7

사용 편집기 템플릿

, 그것은 선택할지 여부를 지정하십시오 Tag 클래스의 사용에 다른 Proeprty를 추가합니다.

당신의 GET 액션에서 지금
public class Tag 
{ 
    public string Name { get; set; } 
    public bool IsSelected { set; get; } 
} 

, 당신은 당신의 모델의 Tags 재산권에 태그의 목록을 설정하고보기에 보냈다.

public ActionResult AddTag() 
{ 
    var vm = new MyModel(); 

    //The below code is hardcoded for demo. you mat replace with DB data. 
    vm.Tags.Add(new Tag { Name = "Test1" }); 
    vm.Tags.Add(new Tag { Name = "Test2" }); 

    return View(vm); 
} 

는 이제, 에디터 템플릿을 만드는 View/YourControllerName로 이동 EditorTemaplates라는 폴더를 만들고 대지 종류 ( Tag.cshtml)의 같은 이름을 가진이 새로운보기를 만들 수 있습니다.

enter image description here

이제 새 편집기 템플릿이 내용을 추가합니다. 자신의 메인보기 이제

@model Tag 
<p> 
    <b>@Model.Name</b> : 
    @Html.CheckBoxFor(x => x.IsSelected) <br /> 
    @Html.HiddenFor(x=>x.Name) 
</p> 

EditorFor HTML을 도우미 방법을 사용하여 편집기 템플릿을 호출합니다. 양식을 게시 할 때

@model MyModel 
<h2>AddTag</h2> 
@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(m => m.Name) 
     @Html.TextBoxFor(m => m.Name) 
    </div>  
    <div> 
     @Html.EditorFor(m=>m.Tags)   
    </div>  
    <input type="submit" value="Submit" /> 
} 

지금, 모형은 선택한 체크 박스가 IsSelected 재산권에 대한 진정한 가치를 낳게 될 것이다 태그 컬렉션이있을 것이다. 이

enter image description here

+1

이 우수합니다! 정확히 내가 뭘했는지, 대단히 고마워! –

1

이것은 내가 작업중인 사이트에서 수행 한 것과 비슷합니다.

나는이 확장이 도움이 @Html.CheckBoxListFor()

희망을 사용했다. 체크 박스를 가지고 들어

0

처럼

[HttpPost] 
public ActionResult AddTag(MyModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     //Check for model.Tags collection and Each items IsSelected property value. 
     //Save and Redirect(PRG pattern) 
    } 
    return View(model); 
} 

당신은 부울을 추가 할 수있는 경우는 다음 방금 루프에 EditorFor (또는 CheckBoxFor)를 사용할 수 있습니다 태그의 모델 속성을의 IsChecked. 트릭은 뷰 주 모델을 통해 속성에 액세스 할 수 있도록 for 루프를 foreach가 아닌 indexer와 함께 사용하는 것입니다. 그런 다음 modelbinder가 나머지 작업을 수행하므로 POST 액션은 태그 IsChecked 속성이 올바른 상태로 설정된 MyModel을받습니다.

모델 :

public class Tag 
{ 
    public string Name { get; set; } 
    public bool IsChecked { get; set; } 
} 

public class MyModel 
{ 
    public string Name { get; set; } 
    public List<Tag> Tags { get; set; } 
} 

보기 :

@model MyMvcApplication.Models.MyModel 
@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(m => m.Name) 
     @Html.TextBoxFor(m => m.Name) 
    </div> 

    <div> 
     @for (int i = 0; i < Model.Tags.Count; i++) 
     { 
      @Html.DisplayFor(x => Model.Tags[i].Name) 
      @Html.EditorFor(x => Model.Tags[i].IsChecked) 
     } 
    </div> 
    <input type="submit" value="Submit" /> 
}