2014-10-25 3 views
0

Я работаю над формой, которая может использоваться для добавления новых записей и обновления существующих записей. Одним из элементов формы является захват нескольких вариантов недельных дней. Поэтому я внедрил DayOfWeek Enum.asp.net MVC Checkboxes DaysOfWeek 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 я не могу понять, как получить значение из моих checkboxes они отправляются в контроллер и 2, как бы я заполнил checkboxlist со значениями, которые я сохранил в своей базе данных, т.е. SelectedDays = 1,4,6.

Надеюсь, я в первую очередь подхожу к этому. любая помощь будет оценена по достоинству.

ответ

2

Это никогда не перестает удивлять меня, как люди настаивают на написании собственного html, а затем смущены, почему все не работает.

Придерживайтесь помощников html, когда это возможно. Меняйте модель немного ... Сделайте SelectedDays массив BOOL [7]

@for(int i = 0; i < Model.SelectedDays.Count; i++) 
{ 
    @Html.CheckBoxFor(x => x.SelectedDays[i]) 
} 

Теперь галочки автоматического заполнения, и по умолчанию для бесконтрольно.

В качестве альтернативы, вы можете добавить «выбранное» Ее поле к классу MyDay, а затем изменить его на:

@for(int i = 0; i < Model.AvailableDays.Count; i++) 
{ 
    @Html.CheckBoxFor(x => x.AvailableDays[i].Selected) 
} 

Примечания: Не изменяйте это использовать Еогеасп, если вы делаете, он выиграл» t создать правильную индексацию для полей имени для публикации значений коллекции.

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(); 
Смежные вопросы