【问题标题】:How to display table of data with checkbox?如何用复选框显示数据表?
【发布时间】:2014-02-27 06:36:39
【问题描述】:

我有一个非常简单的数据表,它返回:

Report1 和一个复选框 Report2 和一个复选框

这是我的看法:

@model GRM_Reports.Models.ReportsModel

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}




@using (Html.BeginForm("Index","Report", FormMethod.Post))
{
        <table>
        <tr style="font-weight:bold">

            <td>
                Report Name
            </td>
            <td>
                Number Of Rows
            </td>
            <td>
                Number Of Errors
            </td>
            <td>
                Run Report
            </td>
        </tr>

            @foreach (var report in Model.ReportList)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modeltem => report.ReportName)
                    </td>
                    <td>
                        @Html.DisplayFor(modeltem => report.NumberOfRows)
                    </td>
                    <td>
                       @Html.DisplayFor(modeltem => report.NumberOfErrors)
                    </td>
                    <td>
                       @Html.CheckBoxFor(modeltem => report.checkBox)
                    </td>
              </tr>
            }
                <tr>
                <td colspan="4">
                    <button type="submit" >Submit Request</button>
                </td>
            </tr>
        </table>
}

当我点击提交按钮时,ReportList 为空。

namespace GRM_Reports.Controllers
{
    public class ReportController : Controller
    {
    public ActionResult Index()
    {
        var model = new ReportsModel();
        Database db = new Database();
        DataTable dt = new DataTable();
        dt = db.GetReportStatus("1/31/2014");
        model.ReportList = new List<Models.Common.Report>();
                    foreach (DataRow row in dt.Rows)
                    {
                        model.ReportList.Add(
                    new Models.Common.Report() 
                    { ReportName = row["Report"].ToString(), 
                      NumberOfRows = int.Parse(row["NumberOfRows"].ToString()), 
                      NumberOfErrors = int.Parse(row["NumberOfErrors"].ToString()),
                      HasData = row["hasData"].ToString()
                    });

        }
        return View(model);
    }




    [HttpPost]
    public ActionResult Index(ReportsModel model)
    {
           foreach (var report in model.ReportList)
           {


           }
        return View();
    }
}
}

我觉得这个方法有问题: [HttpPost] public ActionResult Index(ReportsModel模型)

传递给此方法的模型为空。有什么想法吗?

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc checkbox


    【解决方案1】:

    这是您的解决方案,我通过添加一个 ViewModel 稍微修改了您的模型 -

    public class ReportsModel
    {
        public List<ReportModel> ReportsList { get; set; }
    }
    
    public class ReportModel
    {
        public Report Report { get; set; }
        public bool IsChecked { get; set; }
    }
    
    public class Report
    {
        public string ReportName { get; set; }
        public DateTime ReportDate { get; set; }
        public int NumberOfRows { get; set; }
        public int NumberOfErrors { get; set; }
        public string HasData { get; set; }
    }
    

    然后在 index 动作中,我们构建我们的模型并将其发送到视图 -

        public ActionResult Index()
        {
            ReportsModel model = new ReportsModel();
            model.ReportsList = new List<ReportModel>();
            model.ReportsList.Add(new ReportModel() { Report = new Report() { ReportName = "Report1" }, IsChecked = false });
            model.ReportsList.Add(new ReportModel() { Report = new Report() { ReportName = "Report2" }, IsChecked = false });
            model.ReportsList.Add(new ReportModel() { Report = new Report() { ReportName = "Report3" }, IsChecked = false });
            return View(model);
        }
    

    索引视图将显示复选框 -

    @model MVC.Controllers.ReportsModel
    
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    @using (Html.BeginForm("Submit", "Checkbox", FormMethod.Post))
    {
        for (int i = 0; i < Model.ReportsList.Count; i++)
        {
            @Html.CheckBoxFor(m => m.ReportsList[i].IsChecked) @Model.ReportsList[i].Report.ReportName
            <br />
        }
        <input type="submit" value="Click" />
    }
    

    输出 -

    一旦您选择了一些复选框并单击提交按钮,它将提交到提交操作,您可以获取模型中所有选定的值,如下所示 -

        public ActionResult Submit(ReportsModel model)
        {
            // Do something
            return null;
        }
    

    更新

    要获取Model的所有属性,需要用到HiddenFields,如下图-

    for (int i = 0; i < Model.ReportsList.Count; i++)
    {
        @Html.CheckBoxFor(m => m.ReportsList[i].IsChecked) @Model.ReportsList[i].Report.ReportName
        <br />
    
        @Html.HiddenFor(m => m.ReportsList[i].Report.ReportName);
        @Html.HiddenFor(m => m.ReportsList[i].Report.ReportDate);
        @Html.HiddenFor(m => m.ReportsList[i].Report.NumberOfRows);
        @Html.HiddenFor(m => m.ReportsList[i].Report.NumberOfErrors);
        @Html.HiddenFor(m => m.ReportsList[i].Report.HasData);
    }
    

    【讨论】:

    • 谢谢@ramiramilu 我没有更改我的课程,但是当我单击提交按钮时,我的报告列表为空。你能看一下吗?
    【解决方案2】:

    //型号

    namespace Reports.Models.Common 
    {
        public class Report
        {
            public string ReportName { get; set; }
            public DateTime ReportDate { get; set; }
            public int NumberOfRows { get; set; }
            public int NumberOfErrors { get; set; }
            public string HasData { get; set; }
            public bool Remember {get;set;}
        }
    }
    

    //查看

    @Html.CheckboxFor(x => x.Remember)
    

    【讨论】:

    • 谢谢@Thiago 我添加了你的字段,但是当我点击我的提交按钮时,我的报告列表为空。更改了代码。你能看一下吗?
    • 为@Model.ReportsList[i].Report.ReportName添加隐藏
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2013-03-06
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多