【问题标题】:Generate Dynamically Checkboxes, And Select Some of them as Checked动态生成复选框,并选择其中一些为选中状态
【发布时间】:2012-05-18 01:02:03
【问题描述】:

所以我的问题是这样的,

我有两个列表

列表 A 包含。

  1. 项目 1
  2. 第 2 项
  3. 项目 3
  4. 第 4 项
  5. 第 5 项

列表 B 包含

  1. 项目 1
  2. 第 2 项
  3. 项目 3
  4. 第 4 项
  5. .....
  6. ....
  7. 项目 10

我要做的就是在 MVC Razor 视图中为 B 中的所有项目动态生成复选框,并且在这些复选框中,选中(选择)A 中所有项目的所有复选框。 因为 A 永远是 B 的子集。

然后用户可以选中或取消选中任何框,这些值可以传递给控制器​​以进行保存。列表 A 将使用用户选择的新值进行更新。

有什么帮助吗?

更新 1: 我能够查看 Model.CheckboxSelections 中的所有项目。我不想使用局部视图。我正在尝试类似以下的操作,但仍然缺少一些东西。

         @for (int i = 0; i < Model.CheckboxSelections.Count; i++)
        {
@Html.CheckBox(Model.CheckboxSelections[i].Sku.ToString(), Model.CheckboxSelections[i].IsChecked.ToString())
     }

【问题讨论】:

标签: c# asp.net-mvc c#-4.0 razor checkbox


【解决方案1】:

有一定的重复自己的风险,我会用以下句子开始我的回答:

在 ASP.NET MVC 应用程序中,您应该使用视图模型。

所以:

public class MyViewModel
{
    public string Name { get; set; }
    public bool IsChecked { get; set; }
}

然后是控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // Those are your domain models
        // they could come from a database or something
        var listA = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
        var listB = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10" };

        // Now let's map our domain model to our view model
        var model = listB.Select(x => new MyViewModel
        {
            Name = x,
            IsChecked = listA.Contains(x)
        });

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        var selectedItems = model.Where(x => x.IsChecked);
        var format = string.Join(",", selectedItems.Select(x => x.Name));
        return Content("Thank you for selecting " + format);
    }
}

然后是对应的视图(~/Views/Home/Index.cshtml):

@model IEnumerable<MyViewModel>

@using (Html.BeginForm())
{
    @Html.EditorForModel()
    <button type="submit">OK</button>
}

最后是相应的编辑器模板,它将为模型集合的每个元素自动呈现 (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyViewModel

<div>
    @Html.HiddenFor(x => x.Name)
    @Html.LabelFor(x => x.IsChecked, Model.Name)
    @Html.CheckBoxFor(x => x.IsChecked)
</div>

渲染结果(如我的 Chrome 浏览器所见)如下所示:

看看使用视图模型有多容易?

【讨论】:

  • 感谢您的建议,我为该项目创建了一个类,然后生成了这些项目的列表,现在我将其传递给邮件模型。我所有的项目现在都在里面(Model.CheckboxSelections),我正在尝试做这样的事情,但没有工作。
  • @for (int i = 0; i
  • 这不是我建议的。在我的回答中,我建议使用编辑器模板而不是在视图中编写循环。
  • for 循环不是比渲染局部视图更快吗?
  • 你不应该担心这个。在发布模式下,视图被缓存。
猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多