【问题标题】:i need to pass the values of multiple checkbox items to the controller from the view我需要将多个复选框项的值从视图传递给控制器
【发布时间】:2015-07-10 13:37:42
【问题描述】:
@model IEnumerable<State>

@{
    ViewBag.Title = "Index";
}

<h2>State Data</h2>

<p>
    @Html.ActionLink("Create New", "CreateState")
</p>
<p>
    @using (Html.BeginForm())
    {
        <p>
            Search by Name: @Html.TextBox("searchstring") <br/>
            <input type="submit" value="Filter"/>
        </p>
    }
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Station)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Station)
            </td>
            <td>
                @Html.ActionLink("Update State Data", "UpdateStation", new {id = item.Id}) |
                @Html.ActionLink("Delete", "DeleteState", new {id = item.Id})  | Select to Include in Charts

            </td>
        </tr>
    }

</table>

这是我的代码,我需要为每个项目输入一个@Html.Checkbox(),然后将所选项目的值传递给控制器​​并使用这些值创建一个图表..

我知道如何制作图表,只是不知道如何使用复选框并传递值。

{
    [Table("State")]
    public class State
    {
        public State()
        {
            Orders = new HashSet<Order>();
        }

        public int Id { get; set; }

        [Required]
        [StringLength(50)]
        [Display(Name = "State")]
        public string Name { get; set; }

        [Required]
        public int Station { get; set; }


        public virtual ICollection<Order> Orders { get; set; }
    }
}

【问题讨论】:

  • 复选框中应该包含哪些数据?请展示您的模型
  • 我希望能够传递每个选定项目的名称和站点,以便我可以使用它们来创建图表

标签: asp.net-mvc


【解决方案1】:

Adapted user5103147's DNF to incorporate the Viewmodel idea :)

请尝试使用映射而不是继承。


在您的 State 模型中,添加一个 bool 变量。 bool 变量的默认编辑器是一个复选框,如果你将它添加到 State 模型中,那么 DefaultModelBinder 应该会选择它。

至于传递给控制器​​,也许你应该考虑使用视图模型。

你的实现看起来有点像这样:

public class StateListViewModel 
{
    public List<StateViewModel> States { get; set; }
}


public class StateViewModel : State
{
    public bool Selected { get; set; }
}

然后您可以访问这些值。我有一个答案here,它链接到 Darin Dimitrov 写的关于 View 模型的内容,值得一读。

如果你实现了上述,你可以为每个项目提供一个复选框,并将表格放在一个表单中,然后可以使用 View 模型将其提交给控制器。这将为您提供每个项目的“选定”值,您可以使用它来构建图表。

还应该注意的是,使用视图模型继承域模型通常并不总是一个好主意,但这不会杀死你。更好的选择是创建一个映射器在两者之​​间进行映射,或者使用 Automapper。

【讨论】:

    【解决方案2】:

    如果您添加一个像 @Sippy 建议的 bool 字段,请确保将您的 @foreach 更改为 @for 循环,这样您就可以将完整的集合从视图返回到您的控制器

    @for (var i = 0; i < Model.Count(); i++)
    { 
        <tr>
            <td>
                @Html.CheckBoxFor(modelItem => Model[i].Selected) @* new bool field *@
            </td>
            <td>
                @Html.DisplayFor(modelItem => Model[i].Name)
                @Html.HiddenFor(modelItem => Model[i].Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => Model[i].Station)
                @Html.HiddenFor(modelItem => Model[i].Station)
            </td>
            <td>
                @Html.ActionLink("Update State Data", "UpdateStation", new { id = Model[i].Id }) |
                @Html.ActionLink("Delete", "DeleteState", new { id = Model[i].Id })  | Select to Include in Charts
    
            </td>
        </tr>
    }
    

    那么你的action可以接受一个List,你就可以使用linq来获取选中的item了

    [HttpPost]
    public ActionResult Index(IEnumerable<State> model)
    {
        var selected = model.Where(a => a.Selected == true);
    

    DotNetFiddle Example

    【讨论】:

    • 您为什么需要这样做? O_o 如果他实现了我所说的,唯一的变化将是 foreach 的目标集合需要变为@Model.States
    • 他想be able to pass the name and station of each selected item, so i can use them to create a chart 简单地添加一个复选框并不能做到这一点
    • 所以我继承了领域模型,所以他仍然可以访问那些属性。
    • 但是您如何将值传递回控制器?...通过使所有字段名称相同?..@Html.CheckBoxFor(modelItem =&gt; item.Selected) 会做什么,不会起作用
    • 我添加了一个 DotNetFiddle 示例来说明它是如何工作的。随时使用@Html.CheckBoxFor(modelItem =&gt; item.Selected) 添加您自己的,并向我们展示它是如何工作的
    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2019-06-19
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多