public ActionResult Create (RecurringTask recurringTask, коллекция FormCollection, ICollection dayOfTheWeek)
Извините, но это, вероятно, одна из худших сигнатур действий, которые я когда-либо видел.Смесь модели предметной области, коллекции FormCollection и некоторых ICollection<string>
.
Использование моделей представлений, строго типизированных представлений и шаблонов редактора (это, вероятно, 10 ^ 4-й раз, когда я пишу это предложение в StackOverflow в ответ на вопросыв теге asp.net-mvc
)!Они сделают вашу жизнь намного проще.Итак, список дней и соответствующее логическое свойство, указывающее, выбран ли этот день:
public class MyViewModel
{
public IEnumerable<DayOfWeekViewModel> DaysOfWeek { get; set; }
... put any other properties that you consider useful for this view
}
public class DayOfWeekViewModel
{
public string DayOfWeek { get; set; }
public bool IsSelected { get; set; }
}
, затем контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
DaysOfWeek = CultureInfo
.CurrentCulture
.DateTimeFormat
.DayNames
.Select(x => new DayOfWeekViewModel
{
DayOfWeek = x,
})
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
// model.DaysOfWeek will contain all you need here
// TODO: do some processing
// here you can loop through model.DaysOfWeek to identify which
// days have been selected and take respective actions
// ...
// once you have finished processing you could redirect
return RedirectToAction("success");
}
}
, затем соответствующее представление:
@model MyViewModel
@using (Html.BeginForm())
{
... you could put any other fields from your view model that
will be used by this form here
@Html.EditorFor(x => x.DaysOfWeek)
<input type="submit" value="OK" />
}
и соответствующий шаблон редактора (~/Views/Home/EditorTemplates/DayOfWeekViewModel.cshtml
):
@model DayOfWeekViewModel
<div>
@Html.CheckBoxFor(x => x.IsSelected) @Html.DisplayFor(x => x.DayOfWeek)
@Html.HiddenFor(x => x.DayOfWeek)
</div>