2016-04-14 82 views
0

我正在研究ASP.NET MVC应用程序。在这个应用程序中,我正在创建一个自定义对象顶部的复选框列表。自定义对象是这样的:ASP.NET MVC - CheckBox列表ID,名称和值

public class ListItem<TId, TLabel, TIsChecked> 
{ 
    private TId id; 
    private TLabel label; 
    private TIsChecked isChecked; 

    public ListItem(TId id, TLabel label, TIsChecked isChecked) 
    { 
     this.id = id; 
     this.label = label; 
     this.isChecked = isChecked; 
    } 

    public TId Id 
    { 
     get { return id; } 
    } 

    public TLabel Label 
    { 
     get { return label; } 
    } 

    public TIsChecked IsChecked 
    { 
     get { return isChecked; } 
    } 
} 

我有一个模型,看起来像这样:

public class MyModel 
{ 
    public IEnumerable<ListItem<Guid, string, bool>> Options { get; set; } 
} 

然后我有一个控制器,一个名为档案的动作,看起来像这样:

[HttpGet] 
public ActionResult Profile() 
{ 
    var model = new MyModel(); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Profile(MyModel model) 
{ 
    return View(model); 
} 

我渲染我的复选框选项在我的Razor视图这样的:

@foreach (var option in Model.Options) 
{ 
    <div class="form-group"> 
    <div class="checkbox"> 
    <label> 
    <input name="Options" value="@option.Id" type="checkbox" @((option.IsChecked == true) ? "checked" : string.Empty)>&nbsp;@option.Label 
    </label> 
    </div> 
</div> 
} 

选项渲染正常。但是,当我保存表单时,看起来只有第一个选中的复选框ID被返回。我不知道如何:a)正确地将我的HTML呈现给复选框列表,以及b)将值正确发送回服务器。我在博客文章中看到过其他例子,但是,我的观点将会有更多的HTML。出于这个原因,我试图找出“如何”复选框值在客户端呈现并回发到ASP.NET MVC中的服务器。

回答

1

首先,你必须做的改变在模型中使用List<T>而不是IEnumerable<T>

public List<ListItem<Guid, string, bool>> Options { get; set; } 

其次,你不必为你的属性制定者,所以数据不会被调回,加setter方法:

public TId Id 
{ 
    get { return id; } 
    set { id = value;} 
} 

public TLabel Label 
{ 
    get { return label; } 
    set { label = value;} 
} 

public TIsChecked IsChecked 
{ 
    get { return isChecked; } 
    set { isChecked = value;} 
} 

,最后你只需要使用强类型的HTML辅助和使用循环使索引可以为后期绑定数据:

@for(int i=0; i< Model.Options.Count; i++) 
{ 
    <div class="form-group"> 
    <div class="checkbox"> 
    <label> 
    @Html.CheckBoxFor(model => model.Options[i].IsChecked)&nbsp;@Model.Options[i].Label 
    </label> 
    @Html.HiddenFor(model=> model.Options[i].Id) 
    @Html.HiddenFor(model=> model.Options[i].Label) 
    </div> 
</div> 
} 

这将创建具有正确名称的复选框,以便它们可以在帖子上绑定。

你可能想看看How List binding works