2016-04-14 61 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