2012-08-22 30 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" /> 
} 
相关问题