将Html.CheckBoxFor的多个复选框值返回给控制器 [英] Return several checkbox values of Html.CheckBoxFor to the controller

查看:185
本文介绍了将Html.CheckBoxFor的多个复选框值返回给控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个视图,用户应在其中通过复选框选择多个列出的项目,然后应在控制器中进行操作.

I have a view where the user should select several listed items by checkboxes, which should then be worked within the controller.

但是,我没有将值传递给控制器​​的POST方法.调试时,列表为空.

However, I am not getting the values passed to the POST method of the controller; the List comes in null when debugging.

在寻找答案时,我找不到与C#和Html.CheckboxFor匹配的多个值.

While searching for answers, I was not able to find one matching with C# and the Html.CheckboxFor for multiple values.

我觉得这可能只是个小问题,但是现在几天我都无法解决.

I feel that this may be just a minor thing to fix, but I cannot figure it out for several days now.

这是我的模特:

public class ShownListofTools// This List is given to the View to contain all Tools
{
    public IEnumerable<CheckboxItem> ToolsInShownList { get; set; } = new List<CheckboxItem>();         
}

public  class CheckboxItem //This Model is used to bring the Tools to the View
{
    public int ShownToolID { get; set; }
    public bool IsChecked { get; set; }
    public string DisplayName { get; set; }
    public int RemainingWorkTime { get; set; }
}

这是控制器:

[HttpGet]
public ActionResult IndexforLend()
{
        // 1)
        var notwornouttools = db.Tools.Where(t => t.Max_Worktime - t.CurrentWorktime > 0); // List Tools that are not worn out yet
        var tools = notwornouttools.Where(t => t.UserID == null);  //refine Filter to all tools that are currently not lent by other users                                                                          
        // 2)
        List<CheckboxItem> SelectListTools = new List<CheckboxItem>(); //temporary list, to gather all needed items

        // 3)
        foreach(var item in tools)//work down the "tool" list from above
        {
            SelectListTools.Add(
                new CheckboxItem()//Add a new Checkbox Item
                {
                     DisplayName = item.Tooltype + " " + item.Diameter+"mm", //Transfer the Attributes from the "tool" list
                     ShownToolID = item.ID,
                    IsChecked = false,
                    RemainingWorkTime = item.Max_Worktime - item.CurrentWorktime,
                }
             );
        }

        //Checkboxlist.ToolsInShownList = SelectListTools; //The Checkbox Items are Added to the List "Checkboxlist".
        return View(SelectListTools); // The List "Checkboxlist" is transferred to the View.
}               

//POST: Add Tools to a User
[HttpPost]
public ActionResult IndexforLend([Bind(Include = "IsChecked,ShownToolID")] List<CheckboxItem> chklist)  //import from View, but make it numerable         
{            
    foreach(var item in chklist) //go through the entire Checkboxlist
    {
        if (item.IsChecked == true) // if the Checkbox was Checked - not sure if only checked objects are returned
        {
            var id = item.ShownToolID; // take the Tool-ID to the variable "id"

            foreach(var realtool in db.Tools) //go through all Tools in Database
            {
                if (realtool.ID == id) // if the Id from the Checkbox is found
                {
                    realtool.UserID = LoggedInUser.ID; // set the Foreign Key UserID to the ID of the Logged in User
                    db.Entry(realtool).State = EntityState.Modified;
                    db.SaveChanges();
                }
            }
        };
    }

    return RedirectToAction("Index");
}

视图:

@model  List<WZ_Web2.Models.CheckboxItem>
   <p></p> 
<p></p>
<div>Please select the Tools you want to lend:</div>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
       <table class="table">
           @**@
        <tr>
            <th>
                Select
            </th>
            <th>
                Tool Name
            </th>
            <th>
                Remaining Work Time
            </th>                      
        </tr>

        @foreach (var item in Model)
        {
           <tr>
               <td>
                   @Html.CheckBoxFor(modelItem => item.IsChecked)
                   @Html.HiddenFor(modelItem => item.ShownToolID)

               </td>
               <td>
                   @Html.DisplayFor(modelItem => item.DisplayName)
               </td>              
               <td>
                   @Html.DisplayFor(modelItem => item.RemainingWorkTime)
               </td>

           </tr>
        }
    </table>
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="submit" class="btn btn-default" />        
    </div>
}

推荐答案

使用foreach这样,它不会在帖子中生成带索引的姓名列表.当您通过item进行迭代并设置modelItem时,它会在帖子中生成如下内容:

Using foreach that way it's not generating indexed name list in the post. As you iterate by item and set modelItem, it generates something like this in the post:

item.IsChecked = true& item.ShownToolID = 1& item.IsChecked = false& item.ShownToolID = 2 ...

item.IsChecked=true&item.ShownToolID=1&item.IsChecked=false&item.ShownToolID=2...

但是控制器期望索引列表,例如:

But the controller is expecting an indexed list e.g.:

[0] .IsChecked = true& [0] .ShownToolID = 1& [1] .IsChecked = false& [1] .ShownToolID = 2 ...

[0].IsChecked=true&[0].ShownToolID=1&[1].IsChecked=false&[1].ShownToolID=2...

结果,映射器无法绑定帖子中的数据.我已经检查了一下帖子.尝试改用for ...

As a result, mapper is unable to bind the data in your post. I've figured out by inspecting the post. Try using for instead...

您认为:

@for (int i = 0; i < Model.Count; i++ )
{
    <tr>
        <td>
            @Html.CheckBoxFor(item => Model[i].IsChecked)
            @Html.HiddenFor(item => Model[i].ShownToolID)

        </td>
        <td>
            @Html.DisplayFor(item => Model[i].DisplayName)
        </td>
        <td>
            @Html.DisplayFor(item => Model[i].RemainingWorkTime)
        </td>

    </tr>
}

在您的控制器中:

[HttpPost]
public ActionResult IndexforLend(List<CheckboxItem> chklist)

这篇关于将Html.CheckBoxFor的多个复选框值返回给控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆