2017-01-26 5 views
0

Может ли кто-нибудь помочь мне в разработке расписания студента? Нижеследующие данные скриншотов извлекаются из базы данных в 2 Модели, первая модель имеет отличный start_time и end_time для этого ученика, а вторая модель имеет start_time, end_time и данные курса, в представлении я запускаю цикл по каждому элементу модели 1 и другим внутренним петлям для каждого дня в модели2, см. ниже кодРасчетное расписание

Вопрос: Я хочу организовать расписание, такое же, как календарь перспективы (изображение 2), сгенерировать квадрат с самого начала время до конца, я пробовал большинство плагинов для управления этим без каких-либо успехов.

Благодаря

Image2 Image1

<div class="row"> 
<div class="col-md-12"> 
    <div class="box box-primary"> 
     <div class="box-body"> 

      <table class="table table-bordered" style="background-color:white !important;"> 
       <thead> 
        <tr class="bg-primary align-center"> 
         <td class="text-bold" width="10%">Time</td> 
         <td class="text-bold" width="15%">Sunday</td> 
         <td class="text-bold" width="15%">Monday</td> 
         <td class="text-bold" width="15%">Tuesday</td> 
         <td class="text-bold" width="15%">Wednesday</td> 
         <td class="text-bold" width="15%">Thursday</td> 
         <td class="text-bold" width="15%">Saturday</td> 
        </tr> 

       </thead> 
       @if (Model != null) 
       { 
        foreach (var item in Model.TimeSlot) 
        { 
         <tr class="align-center"> 
          <td class="bg-info text-bold" style="white-space: nowrap;">@item.BEGIN_TIME_DISP - @item.END_TIME_DISP</td> 
          <td class="drop" id="@("Sun" + item.BEGIN_TIME+item.END_TIME)"> 
           @foreach (var Sitem in Model.Schedule.Where(i => i.SUN == "U" && i.BEGIN_TIME == @item.BEGIN_TIME && i.END_TIME == @item.END_TIME)) 
           { 

            <span style="color:blue; font-weight:bold;"> 
             <a href="javascript:void(GetCRNClassRoster('@Sitem.TERM_CODE','@Sitem.COURSE_CRN'));" class="link" title="Click to view class roster"> 

              @Sitem.COURSE_CRN<br /> 
              @Sitem.COURSE_CODE 
             </a><br /> 
             @Sitem.COURSE_TITLE<br /> 
            </span> 
            @Sitem.ROOM_CODE 
            <span style="color:darkred; font-size:10px" class="sDate"> 
             <br /> 
             from @Sitem.START_DATE_CHAR to @Sitem.END_DATE_CHAR<br /> 
            </span> 
           } 
          </td> 
          <td class="drop" id="@("Mon" + item.BEGIN_TIME+item.END_TIME)"> 
           @foreach (var Sitem in Model.Schedule.Where(i => i.MON == "M" && i.BEGIN_TIME == @item.BEGIN_TIME && i.END_TIME == @item.END_TIME)) 
           { 
            <span style="color:blue; font-weight:bold;"> 
             <a href="javascript:void(GetCRNClassRoster('@Sitem.TERM_CODE','@Sitem.COURSE_CRN'));" class="link" title="Click to view class roster"> 
              @Sitem.COURSE_CRN<br /> 
              @Sitem.COURSE_CODE 
             </a><br /> 
             @Sitem.COURSE_TITLE<br /> 
            </span> 
            @Sitem.ROOM_CODE<br /> 
                <span style="color:darkred; font-size:10px" class="sDate"> 

                 from @Sitem.START_DATE_CHAR to @Sitem.END_DATE_CHAR<br /> 
                </span> 
           } 
          </td> 
          <td class="drop" id="@("Tue" + item.BEGIN_TIME+item.END_TIME)"> 
           @foreach (var Sitem in Model.Schedule.Where(i => i.TUE == "T" && i.BEGIN_TIME == @item.BEGIN_TIME && i.END_TIME == @item.END_TIME)) 
           { 
            <span style="color:blue; font-weight:bold;"> 
             <a href="javascript:void(GetCRNClassRoster('@Sitem.TERM_CODE','@Sitem.COURSE_CRN'));" class="link" title="Click to view class roster"> 
              @Sitem.COURSE_CRN<br /> 
              @Sitem.COURSE_CODE 
             </a><br /> 
             @Sitem.COURSE_TITLE<br /> 
            </span> 
            @Sitem.ROOM_CODE<br /> 
                <span style="color:darkred; font-size:10px" class="sDate"> 

                 from @Sitem.START_DATE_CHAR to @Sitem.END_DATE_CHAR<br /> 
                </span> 
           } 
          </td> 
          <td class="drop" id="@("Wed" + item.BEGIN_TIME+item.END_TIME)"> 
           @foreach (var Sitem in Model.Schedule.Where(i => i.WED == "W" && i.BEGIN_TIME == @item.BEGIN_TIME && i.END_TIME == @item.END_TIME)) 
           { 
            <span style="color:blue; font-weight:bold;"> 
             <a href="javascript:void(GetCRNClassRoster('@Sitem.TERM_CODE','@Sitem.COURSE_CRN'));" class="link" title="Click to view class roster"> 
              @Sitem.COURSE_CRN<br /> 
              @Sitem.COURSE_CODE 
             </a><br /> 
             @Sitem.COURSE_TITLE<br /> 
            </span> 
            @Sitem.ROOM_CODE<br /> 
                <span style="color:darkred; font-size:10px" class="sDate"> 

                 from @Sitem.START_DATE_CHAR to @Sitem.END_DATE_CHAR<br /> 
                </span> 
           } 
          </td> 
          <td class="drop" id="@("Thu" + item.BEGIN_TIME+item.END_TIME)"> 
           @foreach (var Sitem in Model.Schedule.Where(i => i.THU == "R" && i.BEGIN_TIME == @item.BEGIN_TIME && i.END_TIME == @item.END_TIME)) 
           { 
            <span style="color:blue; font-weight:bold;"> 
             <a href="javascript:void(GetCRNClassRoster('@Sitem.TERM_CODE','@Sitem.COURSE_CRN'));" class="link" title="Click to view class roster"> 
              @Sitem.COURSE_CRN<br /> 
              @Sitem.COURSE_CODE 
             </a><br /> 
             @Sitem.COURSE_TITLE<br /> 
            </span> 
            @Sitem.ROOM_CODE          <br /> 
                <span style="color:darkred; font-size:10px" class="sDate"> 

                 from @Sitem.START_DATE_CHAR to @Sitem.END_DATE_CHAR<br /> 
                </span> 
           } 
          </td> 
          <td class="drop" id="@("Sat" + item.BEGIN_TIME+item.END_TIME)"> 
           @foreach (var Sitem in Model.Schedule.Where(i => i.SAT == "S" && i.BEGIN_TIME == @item.BEGIN_TIME && i.END_TIME == @item.END_TIME)) 
           { 
            <span style="color:blue; font-weight:bold;"> 
             <a href="javascript:void(GetCRNClassRoster('@Sitem.TERM_CODE','@Sitem.COURSE_CRN'));" class="link" title="Click to view class roster"> 
              @Sitem.COURSE_CRN<br /> 
              @Sitem.COURSE_CODE 
             </a><br /> 
             @Sitem.COURSE_TITLE<br /> 
            </span> 
            @Sitem.ROOM_CODE          <br /> 
                <span style="color:darkred; font-size:10px" class="sDate"> 

                 from @Sitem.START_DATE_CHAR to @Sitem.END_DATE_CHAR<br /> 
                </span> 
           } 
          </td> 

         </tr> 
        } 
       } 
      </table> 

     </div> 
    </div> 
</div> 

+1

Первое, что вам нужно - это модель представления для представления того, что вы хотите отобразить. Если будет содержать свойство коллекции (например, «Список » для каждого (скажем) 30-минутного периода, который представляет строки таблицы. «TimeSlotVM» будет содержать свойство коллекции (например, «Список ») для представления дней, а «DayVM» будет содержат свойства для курса и т. д. и свойство 'int', представляющее продолжительность в 30-минутные периоды.Тогда это просто вложенный цикл foreach, а свойство duration используется для установки атрибута 'rowspan'. –

+0

@StephenMuecke создайте идею, я дам попробовать, единственная проблема - это может замедлить ответ запроса базы данных. – AbuYazan

+1

Не имеет значения для всех запросов, которые вы используете в представлении (что является плохой практикой). Не обман, но посмотрите на [этот ответ] (http://stackoverflow.com/questions/29626914/how-to-represent-a-monthof-checkboxes-in-an-mvc-model/29627829#29627829) для примера, как выглядит модель и представление (в этом случае «DayVM» имеет свойства для отображения сведений о вашем курсе и свойства для количества периодов, которые могут использоваться в вложенном цикле для установки «rowspan» элемент '' (и код будет значительно меньше) –

ответ

1

С текущего <table> макета, вы можете использовать атрибут <td> элементов rowspan, чтобы позволить вашему Course продлить вниз несколько строк по вертикали.

Ваш текущий код просмотра, использующий несколько запросов в вашей модели данных, трудно читать и проверять и дублирует код. Вы должны начать с создания моделей представления для представления вашего дисплея, что в вашем случае означает, что вы представляете ячейку таблицы (содержащую свойства Course, которые вы хотите отобразить), один из которых представляет собой таблицу (коллекцию ячеек) и одну, представляющую таблицу (сбор строк).

public class CourseVM // represents a table cell 
{ 
    public string Code { get; set; } 
    ... // other properties of Course that will be displayed in the view 
    public int? TimeSlots { get; set; } 
} 

Свойство TimeSlot (за неимением лучшего названия) используется для определения количества строк (часов), что Course проходит вниз.

public class WeekVM // represents a table row 
{ 
    public WeekVM() 
    { 
     Days = new List<CourseVM>(); 
     // Hard code for 1 week, but could add a parameter in the constructor to generate a variable number of days 
     for (int i = 0; i < 7; i++) 
     { 
      Days.Add(new CourseVM()); 
     } 
    } 
    public List<CourseVM> Days { get; set; } 
} 

public class ScheduleVM // represents the table 
{ 
    public ScheduleVM(DateTime startDate, TimeSpan startTime, TimeSpan endTime) 
    { 
     StartDate = startDate.Date.Add(startTime); 
     TimeSlots = new List<WeekVM>(); 
     // Assume 1 hour slots 
     int intervals = (int)((endTime - startTime).TotalMinutes)/60; 
     for (int i = 0; i < intervals; i++) 
     { 
      TimeSlots.Add(new WeekVM()); 
     } 
    } 
    public DateTime StartDate { get; set; } 
    public List<WeekVM> TimeSlots { get; set; } 
} 

Затем в контроллере, инициализировать новый экземпляр ScheduleVM и установить его свойства на основе вами коллекции Course

// Set parameters (these may come from parameters in the method 
DateTime startDate = new DateTime(2017, 1, 22); 
TimeSpan startTime = new TimeSpan(9, 0, 0); 
TimeSpan endTime = new TimeSpan(16, 0, 0); 
// Get collection of data model 
IEnumerable<Course> courses = db.Courses.Where(...); 
// Initialize view model 
ScheduleVM model = new ScheduleVM(startDate, startTime, endTime); 
foreach(Course course in courses) 
{ 
    // Get row and column indexes of the table where this instance needs to be displayed 
    int dayIndex = (int)course.StartTime.DayOfWeek; 
    int slotIndex = course.StartTime.Hour - startTime.Hours; 
    // Determine how any rows this needs to span over 
    int timeSlots = (course.EndTime - course.StartTime).Hours; 
    // Set view model properties 
    var courseVM = model.TimeSlots[slotIndex].Days[dayIndex]; 
    courseVM.Code = course.Code; 
    courseVM.Title = course.Title; 
    courseVM.TimeSlots = timeSlots; 
    for (int i = 1; i < timeSlots; i++) 
    { 
     slotIndex++; 
     model.TimeSlots[slotIndex].Days[dayIndex].TimeSlots = 0; 
    } 
} 
return View(model); 

Обратите внимание, что для rowspan на работу, последующие строки должны опустить соответствующие <td> если клетка выше в нее. В приведенном выше коде блок if устанавливает значение TimeSlots в 0 в последующих строках, чтобы его можно было условно проверить в представлении. Затем открывается вид

@model ScheduleVM 
.... 
<table> 
    <thead> 
     <tr> 
      <th></th> 
      @for(int i = 0; i < 7; i++) 
      { 
       <th>@Model.StartDate.AddDays(i).DayOfWeek</th> 
      } 
     </tr> 
    </thead> 
    <tbody> 
     @foreach(var timeSlot in Model.TimeSlots) 
     {   
      <tr> 
       <td>@Model.StartDate.AddHours(rowIndex).ToString("hh:mm tt")</td> 
       @foreach(var course in timeSlot.Days) 
       { 
        if (!course.TimeSlots.HasValue) 
        {  
         <td></td> 
        } 
        else if (course.TimeSlots > 0) 
        { 
         <td rowspan="@course.TimeSlots"> 
          <div class="course"> 
           <div>@course.Code</div> 
           .... // other properties of course 
          </div> 
         </td> 
        } 
       } 
      </tr> 
      rowIndex++; 
     } 
    </tbody> 
</table> 

Для этого вам просто нужно немного css, чтобы создать его.

+0

еще один запрос, я застрял в изменении Timeslot до 30-минутного интервала, не могли бы вы, если возможно, обновить скрипку. – AbuYazan

+0

Обновит скрипку завтра. –

+0

@AbuYazan Я обновил код, чтобы разрешить любой интервал (жестко закодированный до 30 минут на скрипке). Но учтите, что если вы укажете (скажем) 60-минутные интервалы, он ожидает, что время начала и окончания также будет на 60-минутных интервалах (поэтому, если у вас было начальное время 9.30 и задано 60-минутные интервалы, оно будет начинаться с 9.00.) Также обратите внимание, что это не удастся, если у вас есть какие-то совпадающие времена (но это не имеет смысла в любом случае, и я предполагаю, что у вас есть проверки чтобы убедиться, что их нет) –

1

Полный календарь (https://fullcalendar.io/) день вид, что вы ищете здесь.

Библиотека очень расширяема, и я использую ее постоянно.

+0

Я пробовал использовать полный календарь, он нуждается в большой настройке, так как расписание не является реальным календарем, а фиксированной еженедельной таблицей. будет ли какое-либо другое предложение использовать петли и css – AbuYazan

Смежные вопросы