2012-08-22 29 views
4

我現在有定義爲對象Tag如下:返回列表<T>從視圖到控制器在MVC 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班組長指定它是否被選中與否。

public class Tag 
{ 
    public string Name { get; set; } 
    public bool IsSelected { set; get; } 
} 
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屬性爲true值的標籤集合。

[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); 
} 

像這樣

enter image description here

+1

這是極好的!到底是什麼,非常感謝! –

1

這和我在一個網站上所做的工作類似。

我使用這個擴展@Html.CheckBoxListFor()

希望這有助於。

0

如果你可以添加一個布爾財產器isChecked你的標籤模式,那麼你可以只在一個循環中使用EditorFor(或CheckBoxFor)。訣竅是使用索引器(而不是foreach)的for循環,以便通過視圖主模型訪問屬性。然後,modelbinder將爲您完成剩下的工作,以便您的POST操作將接收MyModel並將其標記IsChecked屬性設置爲正確的狀態。

型號:

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" /> 
} 
相關問題