1

我有一个要在创建视图中使用的视图模型:

视图模型

public class ReportViewModel
{
    public int ID { get; set; }
    [Display(Name = "Platform")]
    public string Platform { get; set; }
    [Display(Name = "Logo")]
    public HttpPostedFileBase Logo { get; set; }

}

创建视图

@model HPRWT.ViewModels.ReportViewModel
@using (Html.BeginForm("Create", "Report", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="editor-label">
            @Html.LabelFor(model => model.Platform )

            @Html.EditorFor(model => model.Platform )
            @Html.ValidationMessageFor(model => model.Platform)
        </div>
<div class="editor-label">
            @Html.LabelFor(model => model.Logo)

            <input type="file" id="Logo" name="Logo" />
        </div>
}

这部作品完美。但现在我需要一系列复选框(7x24)来获得空闲时间(7 天,24 小时)。我有一个 id 数组(我需要一个已定义的 id,因为我使用 jquery)。在创建视图中:

@for(int i = 1; i < labels.Length; i++)
        {
            <tr>
                <td>@labels[i][0]</td>@for(int j = 1; j < labels[i].Length; j++)
                    {
                        <td><div><input type="checkbox" id="@ids[i][j]" /><label for="@ids[i][j]"></label></div></td>
                    }

我的 id 就像 R02C00 (行的 R + 2 位数的行数 + C(列)+ 列数(2 位数)。我用以下方法生成它们:

for (int i = 1; i < 8; i++)
                for (int j = 1; j < 25; j++)
                    ids[i][j] = "R" + i.ToString("00") + "C" + (j-1).ToString("00");

这也很有效。现在我的问题是如何获得复选框值。

控制器

[HttpPost]
        public ActionResult Create(ReportViewModel rvm)
        {
            if (ModelState.IsValid)
            {
                rdb.Reports.Add(CreateReport(rvm));
                rdb.SaveChanges();
                return RedirectToAction("Index");  
            }

            return View(rvm);
        }

// Create a report from a reportviewmodel
        private Report CreateReport(ReportViewModel rvm)
        {
            Report report = new Report();


            // Platform
            string platform = rvm.Platform;
            report.Platform = platform ;
// Logo
            HttpPostedFileBase inputFile = rvm.InputFile; // Some code to get the path

return report;
}

如何获取复选框值?如果我在reportviewmodel 中添加一个bool [] [],有没有办法做一个@Html.Checkbox?(如果我必须在 jquery 中更改 ids 名称,我不介意,不是必须拥有像 R01C01 这样的 id ......只有 jquery 中的 ids 与 html 相同)

4

2 回答 2

4

为什么不使用视图模型?

public class FreeHourViewModel
{
    public string Label { get; set; }
    public bool Selected { get; set; }
}

public class ReportViewModel
{
    public ReportViewModel()
    {
        this.FreeHours = Enumerable
            .Range(1, 7)
            .Select(day => 
                Enumerable.Range(1, 24).Select(hour => new FreeHourViewModel
                {
                    Label = string.Format("day: {0}, hour: {1}", day, hour)
                }
            ).ToArray()
        ).ToArray();
    }

    public int ID { get; set; }
    [Display(Name = "Platform")]
    public string Platform { get; set; }
    [Display(Name = "Logo")]
    public HttpPostedFileBase Logo { get; set; }

    public FreeHourViewModel[][] FreeHours { get; set; }
}

接着:

@for (int i = 0; i < Model.FreeHours.Length; i++)
{
    for (int j = 0; j < Model.FreeHours[i].Length; j++)
    {
        @Html.LabelFor(x => x.FreeHours[i][j].Selected, Model.FreeHours[i][j].Label)
        @Html.CheckBoxFor(x => x.FreeHours[i][j].Selected)
    }
}

而当提交表单时,由于您使用了真实的视图模型,模型绑定将按预期工作。此外,您不需要任何 jQuery 来生成这些复选框。强类型的助手,例如Html.CheckBoxFor是要走的路。

于 2013-04-17T12:13:10.267 回答
0

拥有一个与复选框相关的强类型视图怎么样?

public class ReportViewModel
{
    public ReportViewModel()
    {
        Days = new List<Day>();
    }
    public int ID { get; set; }
    [Display(Name = "Platform")]
    public string Platform { get; set; }
    [Display(Name = "Logo")]
    public HttpPostedFileBase Logo { get; set; }
    public IList<Day> Days { get; set; }
}
public class Hour
{
    public int Id { get; set; }
    public bool Selected { get; set; }
}
public class Day
{
    public Day()
    {
        Hours = new List<Hour>();
    }
    public int Id { get; set; }
    public bool Selected { get; set; }
    public IList<Hour> Hours { get; set; }
}

然后你返回一个像这样的视图:

foreach (var d in Enum.GetValues(typeof(DayOfWeek)))
{
    var day = new Day { Id = (int)d };
    for (var i = 0; i < 25; i++)
    {
        day.Hours.Add(new Hour { Id = i });
    }
    model.Days.Add(day);
}
return View(model);

并将其添加到您的视图中:

for (var i = 0; i < 7; i++)
{
    <div id="days">            
        <ul>
            @for (var j = 0; j < 24; j++)
            {
                <li>@Html.CheckBoxFor(m=>Model.Days[i].Hours[j].Selected)</li>
            }
        </ul>  
    </div>
}

现在,当您收到输入时,您有一个 bool 值数组,其中您有一种Ids,即 0-6 天和 0-23 小时。您可以轻松确定选择了特定日期的哪个小时。

当然,您必须用我的建议填写缺失的部分,例如显示每个复选框的标签。

于 2013-04-17T12:19:03.747 回答