0

I am building an online booking system so that people can book doctor appointments online. I have roughly built my MVC 4 controller so that I can test it with the stored procedure that I have to get the available appointments for each doctor.

Below you will see that I have hard coded 10 doctors in the controller but I will need to pull the doctor ID's from a URL & the number of doctors may vary (it may have 10 doctors on the first page but only 1 doctor on the last page).

NOTE: I will also need to add "BusinessID" to the controller & the stored procedure as each doctor can work at multiple businesses.

The URL will look something like (DOC ID's will have 2 parts: StaffID-BusinessID):

http://mydomain.com/Bookings?start=2013-01-01&StaffID=1-1&StaffID=2-1&StaffID=3-1&StaffID=4-1&StaffID=5-1&StaffID=6-1

My questions are:

  1. How can I change the controller so that the Doctors ID's (StaffID's) & BusinessID's can be done dynamically from a url (see example URL above)?
  2. How can I build the parts in my controller dynamically for each SaffID-BusinessID that is in the URL (see the parts with * in the comments)?
  3. How I can optimize this better?

----Get Available Time Slots Controller----

        public ActionResult Index(DateTime? start)
    {
        if (!start.HasValue )
        {
            start = DateTime.Today;
        }

        //get date information (this will always be 7 days)
        var day1 = start.Value.Date;
        var day2 = day1.AddDays(1);
        var day3 = day1.AddDays(2);
        var day4 = day1.AddDays(3);
        var day5 = day1.AddDays(4);
        var day6 = day1.AddDays(5);
        var day7 = day1.AddDays(6);

        //***NOTE: THIS IS HARD CODED TO TEN DOCTORS BUT WILL NEED TO BE ABLE TO GET A DYNAMIC AMOUNT OF DOCTORS AS SOME PAGES MAY ONLY HAVE A FEW DOCTORS ON IT
        //NOTE: Stored Procedure = SP_GetAvailableAppointments @StaffID int = 0, @StartDate Date = NULL, @NumberOfDays INT = 1);
        //get doc1 appointments for the next 7 days
        var model1 = db.SP_GetAvailableAppointments(1, start, 1);
        var model2 = db.SP_GetAvailableAppointments(1, day2, 1);
        var model3 = db.SP_GetAvailableAppointments(1, day3, 1);
        var model4 = db.SP_GetAvailableAppointments(1, day4, 1);
        var model5 = db.SP_GetAvailableAppointments(1, day5, 1);
        var model6 = db.SP_GetAvailableAppointments(1, day6, 1);
        var model7 = db.SP_GetAvailableAppointments(1, day7, 1);

        //get doc2 appointments for the next 7 days
        var model8 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model9 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model10 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model11 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model12 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model13 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model14 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc3 appointments for the next 7 days
        var model15 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model16 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model17 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model18 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model19 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model20 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model21 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc4 appointments for the next 7 days
        var model22 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model23 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model24 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model25 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model26 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model27 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model28 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc5 appointments for the next 7 days
        var model29 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model30 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model31 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model32 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model33 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model34 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model35 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc6 appointments for the next 7 days
        var model36 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model37 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model38 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model39 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model40 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model41 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model42 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc7 appointments for the next 7 days
        var model43 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model44 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model45 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model46 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model47 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model48 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model49 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc8 appointments for the next 7 days
        var model50 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model51 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model52 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model53 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model54 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model55 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model56 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc9 appointments for the next 7 days
        var model57 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model58 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model59 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model60 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model61 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model62 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model63 = db.SP_GetAvailableAppointments(2, day7, 1);

        //get doc10 appointments for the next 7 days
        var model64 = db.SP_GetAvailableAppointments(2, day1, 1);
        var model65 = db.SP_GetAvailableAppointments(2, day2, 1);
        var model66 = db.SP_GetAvailableAppointments(2, day3, 1);
        var model67 = db.SP_GetAvailableAppointments(2, day4, 1);
        var model68 = db.SP_GetAvailableAppointments(2, day5, 1);
        var model69 = db.SP_GetAvailableAppointments(2, day6, 1);
        var model70 = db.SP_GetAvailableAppointments(2, day7, 1);

        //new Json Object - myDates
        var myDates = new 
        {
            date1 = day1.ToShortDateString(),
            date2 = day2.ToShortDateString(),
            date3 = day3.ToShortDateString(),
            date4 = day4.ToShortDateString(),
            date5 = day5.ToShortDateString(),
            date6 = day6.ToShortDateString(),
            date7 = day7.ToShortDateString(),
            dname1 = day1.DayOfWeek.ToString(),
            dname2 = day2.DayOfWeek.ToString(),
            dname3 = day3.DayOfWeek.ToString(),
            dname4 = day4.DayOfWeek.ToString(),
            dname5 = day5.DayOfWeek.ToString(),
            dname6 = day6.DayOfWeek.ToString(),
            dname7 = day7.DayOfWeek.ToString(),
            ndate = day1.AddDays(7).ToString("yyyy-MM-dd"), //next start date
            pdate = day1.AddDays(-7).ToString("yyyy-MM-dd") //previous start date
        };

        //***NOTE: THIS IS HARD CODED TO TEN DOCTORS BUT WILL NEED TO BE ABLE TO GET A DYNAMIC AMOUNT OF DOCTORS AS SOME PAGES MAY ONLY HAVE A FEW DOCTORS ON IT
        //new Json Object - doc1
        var doc1 = new
        {
            staffid = 1,
            day1 = model1,
            day2 = model2,
            day3 = model3,
            day4 = model4,
            day5 = model5,
            day6 = model6,
            day7 = model7
        };

        //new Json Object - doc2
        var doc2 = new
        {
            staffid = 2,
            day1 = model8,
            day2 = model9,
            day3 = model10,
            day4 = model11,
            day5 = model12,
            day6 = model13,
            day7 = model14
        };

        //new Json Object - doc3
        var doc3 = new
        {
            staffid = 3,
            day1 = model15,
            day2 = model16,
            day3 = model17,
            day4 = model18,
            day5 = model19,
            day6 = model20,
            day7 = model21
        };

        //new Json Object - doc5
        var doc4 = new
        {
            staffid = 4,
            day1 = model22,
            day2 = model23,
            day3 = model24,
            day4 = model25,
            day5 = model26,
            day6 = model27,
            day7 = model28
        };

        //new Json Object - doc5
        var doc5 = new
        {
            staffid = 5,
            day1 = model29,
            day2 = model30,
            day3 = model31,
            day4 = model32,
            day5 = model33,
            day6 = model34,
            day7 = model35
        };

        //new Json Object - doc6
        var doc6 = new
        {
            staffid = 6,
            day1 = model36,
            day2 = model37,
            day3 = model38,
            day4 = model39,
            day5 = model40,
            day6 = model41,
            day7 = model42
        };

        //new Json Object - doc7
        var doc7 = new
        {
            staffid = 7,
            day1 = model43,
            day2 = model44,
            day3 = model45,
            day4 = model46,
            day5 = model47,
            day6 = model48,
            day7 = model49
        };

        //new Json Object - doc8
        var doc8 = new
        {
            staffid = 8,
            day1 = model50,
            day2 = model51,
            day3 = model52,
            day4 = model53,
            day5 = model54,
            day6 = model55,
            day7 = model56
        };

        //new Json Object - doc10
        var doc9 = new
        {
            staffid = 9,
            day1 = model57,
            day2 = model58,
            day3 = model59,
            day4 = model60,
            day5 = model61,
            day6 = model62,
            day7 = model63
        };

        //new Json Object - doc10
        var doc10 = new
        {
            staffid = 10,
            day1 = model64,
            day2 = model65,
            day3 = model66,
            day4 = model67,
            day5 = model68,
            day6 = model69,
            day7 = model70
        };

        //Output the Json results
        return Json(new
        {
            myDates,
            doc1,
            doc2,
            doc3,
            doc4,
            doc5,
            doc6,
            doc7,
            doc8,
            doc9,
            doc10
        }, JsonRequestBehavior.AllowGet);

----The JSON Result Required----

{
"myDates": {
    "date1": "22/02/2013",
    "date2": "23/02/2013",
    "date3": "24/02/2013",
    "date4": "25/02/2013",
    "date5": "26/02/2013",
    "date6": "27/02/2013",
    "date7": "28/02/2013",
    "dname1": "Friday",
    "dname2": "Saturday",
    "dname3": "Sunday",
    "dname4": "Monday",
    "dname5": "Tuesday",
    "dname6": "Wednesday",
    "dname7": "Thursday",
    "ndate": "2013-03-01",
    "pdate": "2013-02-15"
},
"doc1": {
    "staffid": 1,
    "day1": [{
        "ID": 34022,
        "StaffID": 1,
        "BusinessID": 1,
        "SlotDay": "Friday",
        "SlotTime": {
            "Ticks": 324000000000,
            "Days": 0,
            "Hours": 9,
            "Milliseconds": 0,
            "Minutes": 0,
            "Seconds": 0,
            "TotalDays": 0.375,
            "TotalHours": 9,
            "TotalMilliseconds": 32400000,
            "TotalMinutes": 540,
            "TotalSeconds": 32400
        },
        "StartDate": "\/Date(1325336400000)\/",
        "EndDate": "\/Date(1577797200000)\/",
        "SlotType": 1,
        "Created": "\/Date(1361389440000)\/",
        "CreatedBy": null,
        "Modified": "\/Date(1361389440000)\/",
        "ModifiedBy": null,
        "Active": true,
        "SlotDate": "\/Date(1361451600000)\/"
    }]
}
}

---UPDATE:---- I am able to get the following json output from my controller but I need to remove the "key" & "value" from myDates & myStaff, and group the appointment times by date - eg: date0, date1, date2..

{
"myDates": [{
    "Key": "date0",
    "Value": "23/02/2013"
}, {
    "Key": "date1",
    "Value": "24/02/2013"
}, {
    "Key": "date2",
    "Value": "25/02/2013"
}, {
    "Key": "date3",
    "Value": "26/02/2013"
}, {
    "Key": "date4",
    "Value": "27/02/2013"
}, {
    "Key": "date5",
    "Value": "28/02/2013"
}, {
    "Key": "date6",
    "Value": "1/03/2013"
}, {
    "Key": "dname0",
    "Value": "Saturday"
}, {
    "Key": "dname1",
    "Value": "Sunday"
}, {
    "Key": "dname2",
    "Value": "Monday"
}, {
    "Key": "dname3",
    "Value": "Tuesday"
}, {
    "Key": "dname4",
    "Value": "Wednesday"
}, {
    "Key": "dname5",
    "Value": "Thursday"
}, {
    "Key": "dname6",
    "Value": "Friday"
}, {
    "Key": "ndate",
    "Value": "2013-03-02"
}, {
    "Key": "pdate",
    "Value": "2013-02-16"
}],
"myStaff": [{
    "Key": "staff0",
    "Value": [
        [{
            "SlotID": 42501,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "23/02/2013",
            "SlotDay": "Saturday",
            "SlotTime": "10:00"
        }, {
            "SlotID": 42502,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "23/02/2013",
            "SlotDay": "Saturday",
            "SlotTime": "10:30"
        }],
        [{
            "SlotID": 47001,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "24/02/2013",
            "SlotDay": "Sunday",
            "SlotTime": "10:00"
        }, {
            "SlotID": 47002,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "24/02/2013",
            "SlotDay": "Sunday",
            "SlotTime": "10:30"
        }]
    ]
}]
}

basically, I need to get the json formatted like below:

{
"myDates": [{
    "date0": "23/02/2013",
    "date1": "24/02/2013",
    "date2": "25/02/2013",
    "date3": "26/02/2013",
    "date4": "27/02/2013",
    "date5": "28/02/2013",
    "date6": "1/03/2013",
    "dname0": "Saturday",
    "dname1": "Sunday",
    "dname2": "Monday",
    "dname3": "Tuesday",
    "dname4": "Wednesday",
    "dname5": "Thursday",
    "dname6": "Friday",
    "ndate": "2013-03-02",
    "pdate": "2013-02-16",
}],
"myStaff": [{
    "staff0": {[ 
      "date0": {[
        [{
            "SlotID": 42501,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "23/02/2013",
            "SlotDay": "Saturday",
            "SlotTime": "10:00"
        }, {
            "SlotID": 42502,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "23/02/2013",
            "SlotDay": "Saturday",
            "SlotTime": "10:30"
        }],
      "date1": {[
            "SlotID": 47001,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "24/02/2013",
            "SlotDay": "Sunday",
            "SlotTime": "10:00"
        }, {
            "SlotID": 47002,
            "StaffID": 1,
            "BusinessID": 1,
            "SlotDate": "24/02/2013",
            "SlotDay": "Sunday",
            "SlotTime": "10:30"
        }]
    ]}
}]
}]
}

This is my controller:

        public ActionResult Index(DateTime start, string id = null)
    {

        var allids = Request.QueryString["id"];

        // split the input into anonymous objects containing staffid and businessid
        var staffids = from staffid in allids.Split(',').Select(x => x.Split('-'))
            select new { sid = int.Parse(staffid[0]), bid = int.Parse(staffid[1]) };

        // get the days you need
        var days = Enumerable.Range(0, 7).Select(x => start.AddDays(x));

        // create myDates
        int i = 0;
        var myDates = (from day in days
                       select new  KeyValuePair<string, string>(
                          String.Format("date{0}", i++),
                          day.ToShortDateString())).ToList();
        i = 0;
        myDates.AddRange(
                      (from day in days
                       select new  KeyValuePair<string, string>(
                          String.Format("dname{0}", i++),
                          day.DayOfWeek.ToString())).ToList());
        myDates.Add(new KeyValuePair<string, string>("ndate", days.First().AddDays(7).ToString("yyyy-MM-dd")));
        myDates.Add(new KeyValuePair<string, string>("pdate", days.First().AddDays(-7).ToString("yyyy-MM-dd")));

        // receive all the stored_procedures
        i = 0;
        var myStaff = from staff in staffids
                      select new KeyValuePair<string, object>(
                         String.Format("staff{0}", i++),
                         (from day in days
                          select db.Database.SqlQuery<GetAvailableAppointments>("EXEC SP_GetAvailableAppointments @StaffID, @BusinessID, @StartDate",
                            new SqlParameter("StaffID", staff.sid),
                            new SqlParameter("BusinessID", staff.bid),
                            new SqlParameter("StartDate", day))).ToList()
                     );

        return Json(new { myDates, myStaff }, JsonRequestBehavior.AllowGet);

    }

Any help would be appreciated :)

MWD
  • 1,632
  • 2
  • 18
  • 39

2 Answers2

1

maybe you also want to use mvc routing for this, add a new route (having a ScheduleController)

//Added UrlParameter.Optional so you can set Default values
routes.MapRoute(
    name: "Schedule",
    url: "Schedule/Get/{start}/{id}",
    defaults: new { 
                   controller = "Schedule", 
                   action = "index", 
                   start = UrlParameter.Optional, 
                   id = UrlParameter.Optional 
              }
);

That way you can just call the action method with a url like

   http://mydomain.com/Bookings/Get/2013-2-23/1-3,2-5

If the controller-action index has the signature

   public ActionResult Index(DateTime? start, string id = "")

MVCs model binding will then bind the params from the url automatically to the signatures variables.

Create a model in your models Folder "MyJsonModels.cs" and fill it with life...

public class Mydate
{
    public string ndate { get; set; }
    public MyDateNDay[] dates { get; set; }
    public string pdate { get; set; }
}

public class MyDateNDay {
    public string date {get; set;}
    public string day { get; set; }
}

public class Mystaff
{
    public Staff[] staff { get; set; }
}

public class Staff
{
    public int StaffID { get; set; }
    public int BusinessID { get; set; }
    public SlotDate[] SlotDates {get; set; }
}

public class SlotDate
{
    public string Date { get; set; }
    public string SlotDay { get; set; }
    public TimeSlot[] slots { get; set; }
}

public class TimeSlot
{
    public int SlotID { get; set; }
    public string SlotTime { get; set; }
}

public class InputData
{
    public int SlotID { get; set; }
    public int StaffID { get; set; }
    public int BusinessID { get; set; }
    public DateTime SlotDate { get; set; }
    public string SlotDay { get; set; }
    public string SlotTime { get; set; }

    public InputData(int sid, int stid, int bid, DateTime day, string time )
    {
        SlotID = sid;
        StaffID = stid;
        BusinessID = bid;
        SlotDate = day;
        SlotDay = day.DayOfWeek.ToString();
        SlotTime = time;
    }
}

Then inside the Index method you would have to implement the real action... (this will not create the exact result you are asking for, i merely show how you can use linq in order to simplify your code and to remove redundancy. Maybe you would use self-created objects to store the results instead of using KeyValuePairs. Again, its just a quick, but working example)

    public ActionResult Index(DateTime? start, string id = "")
    {

        var startdate = start ?? DateTime.Today;

        // split the input into anonymous objects containing staffid and businessid
        var staffids = from staffid in id.Split(',').Select(x => x.Split('-'))
                       select new { sid = int.Parse(staffid[0]), bid = int.Parse(staffid[1]) };

        // get the days you need
        var days = Enumerable.Range(0, 7).Select(x => startdate.AddDays(x));

        // create myDates
        int i = 0;
        Mydate MyDates = new Mydate() {
            ndate = days.First().AddDays(7).ToString("yyyy-MM-dd"),
            pdate = days.First().AddDays(-7).ToString("yyyy-MM-dd"),
            dates = (
                        from day in days
                            select new MyDateNDay { 
                               date = day.ToShortDateString(), 
                               day  = day.DayOfWeek.ToString()
                            }
                    ).ToArray()
        };

        // example InputData - Array as it might be returned by the sql procedure
        /* I added this Array to simulate a possible procedure result your DB could return,
           maybe you can even add a new procedure that would return the data just as in the
           following Array
        */
        var input = new [] { 
           new InputData( 40501, 1, 1, new DateTime(2013, 02, 20), "09:00"),
           new InputData( 40502, 1, 2, new DateTime(2013, 02, 20), "11:00"),
           new InputData( 42501, 1, 3, new DateTime(2013, 02, 23), "10:00"),
           new InputData( 42502, 1, 3, new DateTime(2013, 02, 23), "10:30"),
           new InputData( 45001, 2, 3, new DateTime(2013, 02, 21), "13:00"),
           new InputData( 45002, 2, 4, new DateTime(2013, 02, 22), "15:30"),
           new InputData( 47001, 2, 5, new DateTime(2013, 02, 24), "10:00"),
           new InputData( 47002, 2, 5, new DateTime(2013, 02, 24), "10:30"),
        };

        // receive all the stored_procedures
        i = 0;
        Mystaff MyStaff = new Mystaff()
        {
            staff = (from staff in staffids
                     select new Staff()
                     {
                         StaffID = staff.sid,
                         BusinessID = staff.bid,
                         SlotDates = (from day in days
                                      select new SlotDate()
                                      {
                                          Date = day.ToShortDateString(),
                                          SlotDay = day.DayOfWeek.ToString(),
                                          slots = ( from result in input
                                                    where // filter Slots that fit the requirements
                                                        day == result.SlotDate
                                                        && result.StaffID == staff.sid
                                                        && result.BusinessID == staff.bid
                                                   select new TimeSlot()
                                                   {
                                                       SlotID = result.SlotID,
                                                       SlotTime = result.SlotTime
                                                   }
                                                  ).ToArray()
                                      }
                                     // filter out days that don't have free slots
                                     ).Where(x => x.slots.Length > 0).ToArray()
                     }
                    ).ToArray()
        };


        return Json(new { MyDates, MyStaff}, JsonRequestBehavior.AllowGet);

    }
}

This Action-Method would return the following JSON

{
    "MyDates":
    {
        "ndate": "2013-03-02",
        "dates": [
            {
                "date": "23.02.2013", "day": "Saturday"
            }, {
                "date": "24.02.2013", "day": "Sunday"
            }, {
                "date": "25.02.2013", "day": "Monday"
            }, {
                "date": "26.02.2013", "day": "Tuesday"
            }, {
                "date": "27.02.2013", "day": "Wednesday"
            }, {
                "date": "28.02.2013", "day": "Thursday"
            }, {
                "date": "01.03.2013", "day": "Friday"
            }],
        "pdate": "2013-02-16"
    },
    "MyStaff":
        {
            "staff": [
                {
                    "StaffID": 1,
                    "BusinessID": 3,
                    "SlotDates": [
                        {
                            "Date": "23.02.2013",
                            "SlotDay": "Saturday",
                            "slots": [
                                { "SlotID": 42501, "SlotTime": "10:00" },
                                { "SlotID": 42502, "SlotTime": "10:30" }
                            ]
                        }]
                }, {
                    "StaffID": 2,
                    "BusinessID": 5,
                    "SlotDates": [
                        {
                            "Date": "24.02.2013",
                            "SlotDay": "Sunday",
                            "slots": [
                                { "SlotID": 47001, "SlotTime": "10:00" },
                                { "SlotID": 47002, "SlotTime": "10:30" }
                            ]
                        }
                    ]
                }
            ]
        }
};

I agree, this is not exactly what you were asking for ... but have a look at it, it is actually what you want ... its just that i took the liberty to remove redundancy In JavaScript you can easily walk through the data to display it. Using helper-models like the above MyJsonClasses help you a lot in designing Json-Outputs the way you want.

Well i hope i haven't forgotten anything.

Ingo
  • 1,805
  • 18
  • 31
  • thanks for ur suggestion as I might implement this before we go live.. I think my url should of actually been http://mydomain.com/Bookings?start=2013-01-01&StaffID=1-1&StaffID=2-1&StaffID=3-1&StaffID=4-1&StaffID=5-1&StaffID=6-1 – MWD Feb 22 '13 at 07:33
  • I have update my question with the correct url.. thanks for picking that up ingo :) – MWD Feb 22 '13 at 07:36
  • just unearthed a stackoverflow-question covering the commas at http://stackoverflow.com/questions/198606/can-i-use-commas-in-a-url – Ingo Feb 22 '13 at 07:46
  • I was able to get it working ok but just need to modify the json output slightly. – MWD Feb 23 '13 at 01:59
  • did you create your own objects to collect the data or did you work with anonymous lists with KeyValuePairs in the end? – Ingo Feb 23 '13 at 21:14
  • TBH I haven't been able to get the format I need the json to be in so that I can use mustachejs to display the data. I will post an update o my orig question so that you can see what I mean. – MWD Feb 24 '13 at 00:13
  • I have updated my orig question & have included my current json response & what I need it to end up like. Basically need to remove the "Key" & "Value" words & then group "myStaff" by staff (staff0,staff1,staff2..etc - this works) & dates (date0,date1,date2,date3...etc - need to fix). The reason I need the dates grouped is so that I can display the available appointments for that day. Example: {{#date0}}
    {{SlotTime}}
    {{/date0}}{{^date0}}
    {{notAvailable}}
    {{/date0}} {{#date1}}
    {{SlotTime}}
    {{/date1}}{{^date1}}
    {{notAvailable}}
    {{/date1}}
    – MWD Feb 24 '13 at 00:28
  • starting to modify my answer to get it closer to what you need, will explain everything when i am done. Basically i am introducing classes to contain the data .. but i ll take a few more steps to get "Close" to what you want – Ingo Feb 24 '13 at 15:46
  • Thank Ingo - it works great the I now get the json output required. Now just have to work out how to add the stored procedure back in so I can test it with some live data. – MWD Feb 25 '13 at 00:53
  • feel free to accept the answer ;-) and good to hear it will work out for you... btw have you thought about accessing the database via entity framework directely with linq instead of using stored procedures? – Ingo Feb 25 '13 at 09:33
  • thanks @Ingo.. I have just had the chance to play & it is working great.. I have accepted ur answer :) – MWD Feb 28 '13 at 10:04
  • as for using linq instead of a stored proc - I have actually converted the stored proc to linq.. will look at integrating that. just going to quickly do some other stuff first so we can get some designs in to do their bit.. Thanks again for your help I have learnt alot by going though ur code step by step! – MWD Feb 28 '13 at 10:10
  • glad i was able to help :-) – Ingo Feb 28 '13 at 12:49
0

first, change your controller signature into the following :

public ActionResult Index(DateTime? start, string staffID)

then, add some logic to parse the staffID into your desired result, something like this :

var ids = staffID.Split(',');
var staffIds = ids.Select(p => p.Split('-').First()).ToList();
var businessIds = ids.Select(p => p.Split('-').Last()).ToList();

after that you can do your looping based on staffIds and businessIds list above.

andri
  • 1,021
  • 1
  • 9
  • 16
  • Thanks andri.. That answered my original question but I didn't quite explain things the way I should have as I also need to know how to build the parts of my controller dynamically.. Please see my more detailed question. – MWD Feb 22 '13 at 07:25