我正在处理一个可用于添加新记录和更新现有记录的表单。 一个表单元素是捕获工作日的多个选项。因此,我实施了DayOfWeek Enum。
这就是我的模型的样子
public class EventFormModel
{
public EventFormModel()
{
AvailableDays = (from DayOfWeek d in Enum.GetValues(typeof(DayOfWeek))
select new MyDay
{
Id = (int)d,
Name = d.ToString()
}
public List<MyDay> AvailableDays { get; set; }
public int[] SelectedDays { get; set; }
}
}
public class MyDay
{
public string Name { get; set; }
public int Id { get; set; }
}
我的视图看起来像这样
@foreach (var day in Model.AvailableDays)
{
<input type="checkbox" name="SelectedDays" value="@day.Id"
@if (Model.SelectedDays != null && Model.SelectedDays.Contains(day.Id))
{
<text>checked="checked"</text>
}
/>@day.Name.Substring(0,3)
}
现在我遇到了2个问题,1我无法弄清楚如何从我的复选框中检索它们发布到控制器的值以及2如何用我存储在数据库中的值填充复选框列表即SelectedDays = 1,4,6。
我希望我首先接近这个正确的方法。任何帮助将不胜感激。
答案 0 :(得分:2)
人们如何坚持编写自己的HTML,从而不会让我感到惊讶,然后对于为什么事情不起作用感到困惑。
尽可能坚持使用html助手。稍微改变你的模型......让SelectedDays成为一个bool数组[7]
@for(int i = 0; i < Model.SelectedDays.Count; i++)
{
@Html.CheckBoxFor(x => x.SelectedDays[i])
}
现在复选框会自动填充,默认为未选中。
或者,您可以在MyDay类中添加“selected”bool字段,然后将其更改为:
@for(int i = 0; i < Model.AvailableDays.Count; i++)
{
@Html.CheckBoxFor(x => x.AvailableDays[i].Selected)
}
注意:请勿将此更改为使用foreach,否则,不会为名称字段创建正确的索引以发布集合值。
答案 1 :(得分:0)
经过一段时间的修补,我想出了这个有效的解决方案。
这是模型
public class EventFormModel
{
public EventFormModel()
{
AvailableDays = (from DayOfWeek d in Enum.GetValues(typeof(DayOfWeek))
select new MyDay
{
Id = (int)d,
Name = d.ToString()
}
public List<MyDay> AvailableDays { get; set; }
}
}
public class MyDay
{
public string Name { get; set; }
public int Id { get; set; }
public bool Selected { get; set; }
}
这是视图
@for(int i = 0; i < Model.AvailableDays.Count; i++)
{
<div>
@Html.CheckBoxFor(x => x.AvailableDays[i].Selected)
@Html.HiddenFor(x => x.AvailableDays[i].Name)
@Model.AvailableDays[i].Name
</div>
}
这是控制器
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult AddEvent(EventFormModel model)
{
string days = "";
for(int i = 0; i < model.AvailableDays.Count; i++)
{
if (model.AvailableDays[i].Selected)
{
days = days + model.AvailableDays[i].Name + ",";
}
}
//Do something with your selected days
return View(model);
}
使用选择项
填充复选框string[] stringArray = "Sun,Mon,Tue,Wed".Split(',').ToArray<string>();
model.AvailableDays = (from DayOfWeek d in Enum.GetValues(typeof(DayOfWeek))
select new TestDay
{
Id = (int)d,
Name = d.ToString().Substring(0, 3),
Selected = stringArray.Contains(d.ToString().Substring(0, 3))
}).ToList();