c# - 渲染复选框列表,始终返回为选中状态

时间:2016-11-10 05:51:44

标签: c# checkbox

逗人,

请帮助解决以下问题:

我想在我的视图中呈现复选框列表。

                           @model IEnumerable<CFts.Models.CFModel>
                             ...
                            @foreach (var test in ViewBag.CF_list)
                            {

                                if (test.Text != "" && test.Text != " ")
                                {
                                     <div class="checkbox">
                                         <label><input value="@test.Value" id="CF_list_" name="CF_list_" @(test.Selected == true ? "checked" : "") type="checkbox"> @test.Text</label>
                                     </div>
                                 }
                            }

确定,页面上的复选框。

在控制器(SelectListItem)中生成的CF_list

但问题是 - 如果发送此表单,则至少有一个复选框全部标记为已选中。例如:1。我选择了两个chekckboxed,发送表单 - 一切都OK。 2.我删除所有刻度并发送表格 - 其中一个复选框(最后点击)表示为已选中。

为什么?

CF_List是SelectListItem

另一个问题:

请你帮我理解非常简单的事情

我的班级有模特:

public class VendorAssistanceViewModel
{
    public string Name { get; set; }
    public bool Checked { get; set; }
}
public partial class CSModel : IEntity
{
    public CSModel()
    {

        VendorAssistances = new[]
        {
        new VendorAssistanceViewModel { Name = "DJ/BAND" },
        new VendorAssistanceViewModel { Name = "Officiant" },
        new VendorAssistanceViewModel { Name = "Florist" },
        new VendorAssistanceViewModel { Name = "Photographer" },
        new VendorAssistanceViewModel { Name = "Videographer" },
        new VendorAssistanceViewModel { Name = "Transportation" },
        }.ToList();
    }


    public IList VendorAssistances { get; set; }

我有看法:

@model IEnumerable<CSTS.Models.CSModel>

  ... some html code...
 and how here to show array of checkboxes from Model, using VendorAssistances ?

我知道这很简单,我看了很多文档,但仍然无法理解

谢谢!

1 个答案:

答案 0 :(得分:0)

不要设置checked属性,让value属性决定是否选中它。

更改

<label><input value="@test.Value" id="CF_list_" name="CF_list_" @(test.Selected == true ? "checked" : "") type="checkbox">@test.Text</label>

<label><input value="@test.Value" id="c_" name="CF_list_" type="checkbox">@test.Text</label>

更新:只是为了让这更容易理解..

不要将SelectListItem用于CF_List,而是使用它。 SelectListItem用于下拉列表。

public class CFListCheckbox
{
    public bool IsChecked { get; set; } // Add a property to know if the checkbox should be checked or not
    public string Text { get; set; }
    public object Value { get; set; }  // Change as needed
}

在你的GET行动中..

// Assign an ICollection<CFListCheckbox> to your ViewBag.CF_list 
ICollection<CFListCheckbox> cfListCB = cfCollection.Select(r => new CFListCheckbox()
{
    IsChecked = false,
    Text = r.SomeProp,
    Value = r.SomePropOrWhatever
}).ToList();
ViewBag.CF_list = cfListCB;

在您的视图中,使用Html.Checkbox创建复选框。

@foreach (var test in ViewBag.CF_list)
{    
    if (!string.IsNullOrWhiteSpace(test.Text))
    {
        <div class="checkbox">
            <label>
                @Html.Checkbox("CF_list_", test.IsChecked, new { Value = test.Value }) @test.Text
            </label>
        </div>
    }
}

在你的POST动作中,只需设置ViewBag.ViewBag.CF_list以防你的帖子失败并返回视图。

// Assign an ICollection<CFListCheckbox> to your ViewBag.CF_list 
ICollection<CFListCheckbox> cfListCB = cfCollection.Select(r => new CFListCheckbox()
{
    IsChecked = false,
    Text = r.SomeProp,
    Value = r.SomePropOrWhatever
}).ToList();

// Add logic to re-assign the IsChecked property for your ViewBag.CF_list
foreach(var entry in model.CF_list_)
{
    CFListCheckbox item = cfListCB.FirstOrDefault(r => r.Text == entry.SomeProp && r.Value == entry.SomePropOrWhatever);
    if(item != null)
    {
        item.IsChecked = true;
    }
}

ViewBag.CF_list = cfListCB;

return View(model);

请注意,示例代码只是为了让您了解自己可以做些什么。这不是绝对的。根据需要进行优化。