2013-06-17 3 views
2

У меня есть представление, которому нужны некоторые флажки, описывающие дни недели. Я хочу вернуться к контроллеру, которые выбраны. Я нашел некоторую помощь от различных поисков Google и т. Д., И вот что у меня есть.MVC Checkbox grouping

Раздел 1:

В контроллере:

vm.AllDays = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>().ToList(); 

В Вид:

@foreach (var day in Model.AllDays) { 
    <input type="checkbox" name="days" value="@day"/> <label>@day</label><br /> 
} 

, а затем в моем почтовом обработчиком:

[HttpPost] 
public ActionResult _AddEdit(SubscriptionDetailsModel vm, IEnumerable<string> days) { 
    //etc, etc, etc 
} 

Это работает, я получаю выбранные дни, входящие в параметр days. Тем не менее, мне стало любопытно и изменил атрибут «name» на флажках в поле в моей модели, что в конечном итоге я хочу, чтобы эти значения шли. Таким образом, моя модель для представления содержит объект, в котором есть список. Этот список - это коллекция, в которой мне бы хотелось, чтобы выбранные значения оказались в конце. Но вот соответствующий код.

Раздел 2

Модель сниппеты:

public class SubscriptionDetailsModel { 
    public CronTabModel CrontabModel { get; set; } 
    //... 
} 

public class CronTabModel { 
    public List<DayOfWeek> On { get; set; } 
} 

Контроллер:

[HttpPost] 
public ActionResult _AddEdit(SubscriptionDetailsModel vm) { 
    //etc, etc, etc 
} 

И, конечно же, вид:

@foreach (var day in Model.AllDays) { 
    <input type="checkbox" name="On" value="@day"/> <label>@day</label><br /> 
} 

Ed Это: причина, по которой я встречал путаные результаты, связана с опечаткой в ​​другом месте моего представления.

Технически код в разделе 1 применим для моей ситуации, я могу провести синтаксический анализ строк и т. Д. Можно ли заполнить группу Checkbox из одной коллекции (Model.AllDays) и вернуться во вторую коллекцию (например, Model.CronTabModel.On)?

ответ

1

Модель привязки к списку несколько неудобна, но возможна. У MVC есть проблема с пробелами в индексах, они действительно создали помощника, чтобы исправить это. Скрытое поле позволяет MVC знать о пробелах, чтобы он мог эффективно связываться.

@for (var index =; index < Model.AllDays.Count(); index++) { 
    @Html.Hidden("AllDays.Index", index) 
    @Html.CheckBoxFor(m => Model.AllDays[Index], new { Value= Model.AllDays[index] } 
    <label>@Model.AllDays[Index]</label><br /> 
} 

Это должно позволить вам связать в список флажков, которые размещают свои ценности обратно и привязанных к свойству называется Alldays на вашей модели.

Если вы хотите изменить имя, вам нужно будет изменить имя на модели, которую вы передадите. Делая это таким образом позволяет MVC добавить шагового на имя, так что вы в конечном итоге с

AllDays[0] = "Sunday" 
AllDays[1] = "Monday" 

Etc и т.д.

Некоторые более чтение о массиве связывания http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx