我正在建立一个在线预订系统,以便人们可以在线预约医生预约。我大致构建了我的MVC 4控制器,以便我可以使用存储过程对其进行测试,以便为每位医生提供可用的约会。
下面你会看到我在控制器中有10位医生的硬编码,但是我需要从URL&医生的数量可能会有所不同(第一页可能有10名医生,但最后一页只有1名医生)。
注意:我还需要将“BusinessID”添加到控制器&每个医生都可以在多个企业工作的存储过程。
URL看起来像(DOC ID将包含2部分: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
我的问题是:
----获取可用的时隙控制器----
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);
----需要JSON结果----
{
"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)\/"
}]
}
}
---更新:---- 我可以从我的控制器获得以下json输出,但我需要删除“key”&来自myDates&的“价值” myStaff,并按日期对约会时间进行分组 - 例如: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"
}]
]
}]
}
基本上,我需要将json格式化为如下所示:
{
"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"
}]
]}
}]
}]
}
这是我的控制者:
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);
}
任何帮助将不胜感激:)
答案 0 :(得分:1)
也许您还想为此使用mvc路由,添加新路由(具有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
}
);
这样你就可以使用像
这样的网址调用action方法 http://mydomain.com/Bookings/Get/2013-2-23/1-3,2-5
如果控制器动作索引具有签名
public ActionResult Index(DateTime? start, string id = "")
然后,MVC模型绑定会自动将URL中的参数绑定到签名变量。
在模型中创建模型Folder&#34; MyJsonModels.cs&#34;并填补它的生命...
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;
}
}
然后在Index方法中你必须实现真正的动作......(这不会创建你要求的确切结果,我只是展示你如何使用linq来简化代码和删除冗余也许你会使用自己创建的对象来存储结果,而不是使用KeyValuePairs。再次,它只是一个快速但有效的例子)
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);
}
}
此Action-Method将返回以下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" }
]
}
]
}
]
}
};
我同意,这不完全是你要求的......但看看它,它实际上是你想要的...它只是我冒昧地删除了冗余 在JavaScript中,您可以轻松浏览数据以显示它。使用上面的帮助模型MyJsonClasses可以帮助您按照自己的方式设计Json-Outputs。
我希望我没有忘记任何事情。
答案 1 :(得分:0)
首先,将控制器签名更改为以下内容:
public ActionResult Index(DateTime? start, string staffID)
然后,添加一些逻辑来将staffID
解析为您想要的结果,如下所示:
var ids = staffID.Split(',');
var staffIds = ids.Select(p => p.Split('-').First()).ToList();
var businessIds = ids.Select(p => p.Split('-').Last()).ToList();
之后,您可以根据上面的staffIds
和businessIds
列表进行循环。