MVC 4 CONTROLER - 使用动态STAFFID是的&安培; BusinessID的而不是硬codeD的人 [英] MVC 4 controler - using dynamic StaffID's & BusinessID's instead of hard coded ones
问题描述
我建立一个在线预订系统,使人们可以在网上预定医生预约。我粗略建立我的MVC 4控制器,以便我可以,我有获得可用约会每位医生的存储过程进行测试。
下面你会看到,我已经很难$ C $ 10 CD医生控制器,但我需要从一个URL和放大器拉医生的ID;医生数量可能会有所不同(它可能在第一页上的10名医生,但只有1名医生最后一页)。
请注意:我还需要添加BusinessID到控制器&放大器;存储过程,因为每个医生可以在多个业务工作。
的URL看起来像(DOC的ID将有2部分:STAFFID是-BusinessID):
<$p$p><$c$c>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我的问题是:
- 如何更改控制器,使医生的ID(STAFFID是的)及BusinessID的可以动态地从URL进行(见上面的例子URL)?
- 如何建立动态我的控制器对每个SaffID-BusinessID那就是在URL中的部分(请参阅使用部分的 * 的在评论)?
- 如何优化这更好的?
----获取可用时隙控制器----
公众的ActionResult指数(日期时间?开始)
{
如果(!start.HasValue)
{
开始= DateTime.Today;
} //获取最新的信息(这将永远是7天)
VAR DAY1 = start.Value.Date;
变种DAY2 = day1.AddDays(1);
变种第3天= day1.AddDays(2);
变种第四天= day1.AddDays(3);
变种DAY5 = day1.AddDays(4);
变种DAY6 = day1.AddDays(5);
变种DAY7 = day1.AddDays(6); // ***注意:这很难coded到十博士,但必须将能够得到医生一个动态的数额有些可能只在其上几个医生
//注意:存储过程= SP_GetAvailableAppointments @StaffID INT = 0,@StartDate日期= NULL,@NumberOfDays INT = 1);
//获取DOC1预约未来7天
VAR模型1 = db.SP_GetAvailableAppointments(1,启动,1);
VAR模型2 = db.SP_GetAvailableAppointments(1,第2天,1);
变种model3 = db.SP_GetAvailableAppointments(1,第3天,1);
变种model4 = db.SP_GetAvailableAppointments(1,第四天,1);
变种model5 = db.SP_GetAvailableAppointments(1,DAY5,1);
变种model6 = db.SP_GetAvailableAppointments(1,DAY6,1);
变种model7 = db.SP_GetAvailableAppointments(1,第7天,1); //获取DOC2预约未来7天
变种model8 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model9 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model10 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model11 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model12 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model13 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model14 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc3的预约未来7天
变种model15 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model16 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model17 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model18 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model19 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model20 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model21 = db.SP_GetAvailableAppointments(2,第7天,1); //获取DOC4预约未来7天
变种model22 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model23 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model24 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model25 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model26 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model27 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model28 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc5预约未来7天
变种model29 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model30 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model31 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model32 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model33 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model34 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model35 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc6预约未来7天
变种model36 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model37 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model38 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model39 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model40 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model41 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model42 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc7预约未来7天
变种model43 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model44 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model45 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model46 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model47 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model48 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model49 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc8预约未来7天
变种model50 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model51 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model52 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model53 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model54 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model55 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model56 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc9预约未来7天
变种model57 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model58 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model59 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model60 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model61 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model62 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model63 = db.SP_GetAvailableAppointments(2,第7天,1); //获取doc10预约未来7天
变种model64 = db.SP_GetAvailableAppointments(2,DAY1,1);
变种model65 = db.SP_GetAvailableAppointments(2,DAY2,1);
变种model66 = db.SP_GetAvailableAppointments(2,第3天,1);
变种model67 = db.SP_GetAvailableAppointments(2,第四天,1);
变种model68 = db.SP_GetAvailableAppointments(2,DAY5,1);
变种model69 = db.SP_GetAvailableAppointments(2,DAY6,1);
变种model70 = db.SP_GetAvailableAppointments(2,第7天,1); //新的JSON对象 - myDates
VAR myDates =新
{
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),接下来//开始日期
PDATE = day1.AddDays(-7)的ToString(YYYY-MM-DD)// previous开始日期
}; // ***注意:这很难coded到十博士,但必须将能够得到医生一个动态的数额有些可能只在其上几个医生
//新的JSON对象 - DOC1
VAR DOC1 =新
{
STAFFID = 1,
DAY1 = MODEL1,
DAY2 = MODEL2,
DAY3 = model3,
第四天= model4,
第5天= model5,
DAY6 = model6,
第7天= model7
}; //新的JSON对象 - DOC2
VAR DOC2 =新
{
STAFFID = 2,
DAY1 = model8,
DAY2 = model9,
DAY3 = model10,
第四天= model11,
第5天= model12,
DAY6 = model13,
第7天= model14
}; //新的JSON对象 - doc3的
VAR doc3的新=
{
STAFFID是= 3,
DAY1 = model15,
DAY2 = model16,
DAY3 = model17,
第四天= model18,
第5天= model19,
DAY6 = model20,
第7天= model21
}; //新的JSON对象 - doc5
VAR DOC4 =新
{
STAFFID = 4,
DAY1 = model22,
DAY2 = model23,
DAY3 = model24,
第四天= model25,
第5天= model26,
DAY6 = model27,
第7天= model28
}; //新的JSON对象 - doc5
VAR doc5 =新
{
STAFFID = 5,
DAY1 = model29,
DAY2 = model30,
DAY3 = model31,
第四天= model32,
第5天= model33,
DAY6 = model34,
第7天= model35
}; //新的JSON对象 - doc6
VAR doc6 =新
{
STAFFID = 6,
DAY1 = model36,
DAY2 = model37,
DAY3 = model38,
第四天= model39,
第5天= model40,
DAY6 = model41,
第7天= model42
}; //新的JSON对象 - doc7
VAR doc7 =新
{
STAFFID = 7,
DAY1 = model43,
DAY2 = model44,
DAY3 = model45,
第四天= model46,
第5天= model47,
DAY6 = model48,
第7天= model49
}; //新的JSON对象 - doc8
VAR doc8 =新
{
STAFFID = 8,
DAY1 = model50,
DAY2 = model51,
DAY3 = model52,
第四天= model53,
第5天= model54,
DAY6 = model55,
第7天= model56
}; //新的JSON对象 - doc10
VAR doc9 =新
{
= STAFFID 9,
DAY1 = model57,
DAY2 = model58,
DAY3 = model59,
第四天= model60,
第5天= model61,
DAY6 = model62,
第7天= model63
}; //新的JSON对象 - doc10
VAR doc10 =新
{
STAFFID = 10,
DAY1 = model64,
DAY2 = model65,
DAY3 = model66,
第四天= model67,
第5天= model68,
DAY6 = model69,
第7天= model70
}; //输出JSON的结果
返回JSON(新
{
myDates,
DOC1,
DOC2,
doc3的,
DOC4,
doc5,
doc6,
doc7,
doc8,
doc9,
doc10
},JsonRequestBehavior.AllowGet);
---- JSON结果所需----
{
myDates:{
日期1:22/02/2013,
日期2:23/02/2013,
DATE3:24/02/2013,
date4:25/02/2013,
date5:26/02/2013,
date6:27/02/2013,
date7:28/02/2013,
dname1:星期五,
dname2:星期六,
dname3:星期天,
dname4:星期一,
dname5:星期二,
dname6:周三
dname7:星期四,
ndate:2013-03-01,
PDATE:2013年2月15日
},
DOC1:{
STAFFID是:1,
DAY1:[{
ID:34022,
STAFFID是:1,
BusinessID:1,
SlotDay:星期五,
SlotTime:{
滴答:3240亿,
天:0,
时间:9,
毫秒:0,
纪要:0,
秒:0,
TotalDays:0.375,
TotalHours:9,
TotalMilliseconds:32400000,
TotalMinutes:540,
TotalSeconds:32400
},
开始日期:\\ /日期(1325336400000)\\ /
结束日期:\\ /日期(1577797200000)\\ /
SlotType:1,
创建:\\ /日期(1361389440000)\\ /
CreatedBy:空,
修改时间:\\ /日期(1361389440000)\\ /
ModifiedBy:空,
活动:真实,
SlotDate:\\ /日期(1361451600000)\\ /
}]
}
}
---更新:----
我能够从我的控制器得到以下JSON输出,但我需要删除的钥匙&放大器; 价值从myDates&安培; myStaff和组按日期的约会时间 - 例如:DATE0,DATE1,DATE2 ..
{
myDates:[{
钥匙:DATE0
值:23/02/2013
},{
钥匙:DATE1
值:24/02/2013
},{
钥匙:日期2
值:25/02/2013
},{
钥匙:DATE3
值:26/02/2013
},{
钥匙:date4
值:27/02/2013
},{
钥匙:date5
值:28/02/2013
},{
钥匙:date6
值:2013年1月3日
},{
钥匙:dname0
值:星期六
},{
钥匙:dname1
值:星期天
},{
钥匙:dname2
值:星期一
},{
钥匙:dname3
值:星期二
},{
钥匙:dname4
值:周三
},{
钥匙:dname5
值:星期四
},{
钥匙:dname6
值:星期五
},{
钥匙:ndate
值:2013年3月2日
},{
钥匙:PDATE
值:2013年2月16日
}],
myStaff:[{
钥匙:staff0
值:
[{
slotID用于:42501,
STAFFID是:1,
BusinessID:1,
SlotDate:23/02/2013,
SlotDay:星期六,
SlotTime:10:00
},{
slotID用于:42502,
STAFFID是:1,
BusinessID:1,
SlotDate:23/02/2013,
SlotDay:星期六,
SlotTime:10:30
}],
[{
slotID用于:47001,
STAFFID是:1,
BusinessID:1,
SlotDate:24/02/2013,
SlotDay:星期天,
SlotTime:10:00
},{
slotID用于:47002,
STAFFID是:1,
BusinessID:1,
SlotDate:24/02/2013,
SlotDay:星期天,
SlotTime:10:30
}]
]
}]
}
基本上,我需要得到JSON格式如下图所示:
{
myDates:[{
DATE0:23/02/2013,
日期1:24/02/2013,
日期2:25/02/2013,
DATE3:26/02/2013,
date4:27/02/2013,
date5:28/02/2013,
date6:2013年1月3日,
dname0:星期六,
dname1:星期天,
dname2:星期一,
dname3:星期二,
dname4:周三
dname5:星期四,
dname6:星期五,
ndate:2013年3月2日,
PDATE:2013年2月16日,
}],
myStaff:[{
staff0:{[
DATE0:{[
[{
slotID用于:42501,
STAFFID是:1,
BusinessID:1,
SlotDate:23/02/2013,
SlotDay:星期六,
SlotTime:10:00
},{
slotID用于:42502,
STAFFID是:1,
BusinessID:1,
SlotDate:23/02/2013,
SlotDay:星期六,
SlotTime:10:30
}],
日期1:{[
slotID用于:47001,
STAFFID是:1,
BusinessID:1,
SlotDate:24/02/2013,
SlotDay:星期天,
SlotTime:10:00
},{
slotID用于:47002,
STAFFID是:1,
BusinessID:1,
SlotDate:24/02/2013,
SlotDay:星期天,
SlotTime:10:30
}]
]}
}]
}]
}
这是我的控制器:
公众的ActionResult指数(DateTime的开始,字符串ID = NULL)
{ VAR allids =的Request.QueryString [身份证]; //分裂投入STAFFID含和businessid匿名对象
从STAFFID变种staffids =在allids.Split(,)选择(X =&GT; x.Split(' - '))。
选择新{SID = int.Parse(STAFFID是[0]),投标= int.Parse(STAFFID是[1])}; //得到你所需要的天
变种天= Enumerable.Range(0,7)。选择(X =&GT; start.AddDays(X)); //创建myDates
INT I = 0;
VAR myDates =(从第一天在天
选择新KeyValuePair&LT;字符串,字符串&GT;(
的String.Format(日期{0},我++)
day.ToShortDateString()))了ToList();
I = 0;
myDates.AddRange(
(从日日
选择新KeyValuePair&LT;字符串,字符串&GT;(
的String.Format(DNAME {0},我++)
day.DayOfWeek.ToString()))了ToList())。
myDates.Add(新KeyValuePair&LT;字符串,字符串方式&gt;(ndate,days.First()AddDays(7)的ToString(YYYY-MM-DD)));
myDates.Add(新KeyValuePair&LT;字符串,字符串方式&gt;(PDATE,days.First()AddDays(-7)的ToString(YYYY-MM-DD))); //接收所有stored_procedures
I = 0;
VAR myStaff =从staffids人员
选择新KeyValuePair&LT;字符串对象&gt;(
的String.Format(工作人员{0},我++)
(从日日
选择db.Database.SqlQuery&LT; GetAvailableAppointments&GT;(EXEC SP_GetAvailableAppointments @StaffID,@BusinessID,@StartDate
新的SqlParameter(STAFFID是staff.sid)
新的SqlParameter(BusinessID,staff.bid)
新的SqlParameter(起始日期,日)))。了ToList()
); 返回JSON(新{myDates,myStaff},JsonRequestBehavior.AllowGet); }
任何帮助将是AP preciated:)
也许你也想使用MVC路由对于这一点,添加新的路由(有一个ScheduleController)
//添加UrlParameter.Optional这样你就可以设置默认值
routes.MapRoute(
名称:时间表,
网址:计划/获取/ {开始} / {ID}
默认:新{
控制器=时间表,
行动=指数,
开始= UrlParameter.Optional,
ID = UrlParameter.Optional
}
);
这样,你可以只调用操作方法与URL像
http://mydomain.com/Bookings/Get/2013-2-23/1-3,2-5
如果控制器动作指数有签名
公众的ActionResult指数(日期时间?开始,字符串ID =)
MVCS模型绑定,然后将绑定PARAMS从URL自动签名变量。
在你的模型文件夹MyJsonModels.cs创建一个模型,并用生命填充...
公共类数值指明MyDate
{
公共字符串ndate {搞定;组; }
公共MyDateNDay [] {日期搞定;组; }
公共字符串PDATE {搞定;组; }
}公共类MyDateNDay {
公共字符串日期{搞定;组;}
公共字符串一天{搞定;组; }
}公共类Mystaff
{
公众人员[] {员工获得;组; }
}公共类人员
{
公众诠释{STAFFID获得;组; }
公众诠释BusinessID {搞定;组; }
公共SlotDate [] {SlotDates获得;组; }
}公共类SlotDate
{
公共字符串日期{搞定;组; }
公共字符串SlotDay {搞定;组; }
公共时隙[] {插槽得到;组; }
}公共类时隙
{
公众诠释slotID用于{搞定;组; }
公共字符串SlotTime {搞定;组; }
}公共类InputData
{
公众诠释slotID用于{搞定;组; }
公众诠释{STAFFID获得;组; }
公众诠释BusinessID {搞定;组; }
公众的DateTime SlotDate {搞定;组; }
公共字符串SlotDay {搞定;组; }
公共字符串SlotTime {搞定;组; } 公共InputData(INT SID,诠释STID,诠释投标,日期一天,串时间)
{
slotID用于= SID;
= STAFFID STID;
BusinessID =投标;
SlotDate =日;
SlotDay = day.DayOfWeek.ToString();
SlotTime =时间;
}
}
那么索引方法中你就必须实现真正的行动......(这不会产生你所要求的确切的结果,我只是告诉你如何使用LINQ为了简化您的code和去除冗余。也许你会使用自创建的对象,而不是存储使用KeyValuePairs的结果。同样,它只是一个快,但工作的例子)
公众的ActionResult指数(日期时间?开始,字符串ID =)
{ VAR STARTDATE =启动? DateTime.Today; //分裂投入STAFFID含和businessid匿名对象
从STAFFID变种staffids =在id.Split(,)选择(X =&GT; x.Split(' - '))。
选择新{SID = int.Parse(STAFFID是[0]),投标= int.Parse(STAFFID是[1])}; //得到你所需要的天
变种天= Enumerable.Range(0,7)。选择(X =&GT; startdate.AddDays(X)); //创建myDates
INT I = 0;
数值指明MyDate MyDates =新数值指明MyDate(){
ndate = days.First()。AddDays(7)的ToString(YYYY-MM-DD),
PDATE = days.First()。AddDays(-7)的ToString(YYYY-MM-DD),
日期=(
从第一天的日子
选择新MyDateNDay {
日期= day.ToShortDateString()
天= day.DayOfWeek.ToString()
}
).ToArray()
}; //例如InputData - 阵列,因为它可能由SQL过程返回
/ *我说这个数组来模拟一个可能的程序导致您的数据库可以返回,
也许你甚至可以添加一个能返回数据,就像在一个新的程序
下面的数组
* /
VAR输入=新[] {
新InputData(40501,1,1,新的日期时间(2013,02,20),09:00),
新InputData(40502,1,2,新的日期时间(2013,02,20),11:00),
新InputData(42501,1,3,新的DateTime(2013,02,23),10:00),
新InputData(42502,1,3,新的DateTime(2013,02,23),10:30),
新InputData(45001,2,3,新的DateTime(2013,02,21),13:00),
新InputData(45002,2,4,新的DateTime(2013,02,22),15:30),
新InputData(47001,2,5,新的日期时间(2013,02,24),10:00),
新InputData(47002,2,5,新的日期时间(2013,02,24),10:30),
}; //接收所有stored_procedures
I = 0;
Mystaff MyStaff =新Mystaff()
{
工作人员=(从staffids人员
选择新员工()
{
= STAFFID staff.sid,
BusinessID = staff.bid,
SlotDates =(从第一天在天
选择新SlotDate()
{
日期= day.ToShortDateString()
SlotDay = day.DayOfWeek.ToString(),
插槽=(从结果输入
其中,适合要求//过滤器插槽
天== result.SlotDate
&功放;&安培; result.StaffID == staff.sid
&功放;&安培; result.BusinessID == staff.bid
选择新的时隙()
{
slotID用于= result.SlotID,
SlotTime = result.SlotTime
}
).ToArray()
}
//滤除天没有空闲插槽
)。凡(X =&GT; x.slots.Length大于0).ToArray()
}
).ToArray()
};
返回JSON(新{MyDates,MyStaff},JsonRequestBehavior.AllowGet); }
}
此操作 - 方法将返回以下JSON
{
MyDates:
{
ndate:2013年3月2日,
日期: [
{
日期:2013年2月23日,天:星期六
},{
日期:2013年2月24日,天:星期天
},{
日期:2013年2月25日,天:星期一
},{
日期:2013年2月26日,天:星期二
},{
日期:2013年2月27日,天:周三
},{
日期:2013年2月28日,天:星期四
},{
日期:2013年3月1日,天:星期五
}],
PDATE:2013年2月16日
},
MyStaff:
{
参谋:
{
STAFFID是:1,
BusinessID:3,
SlotDates:[
{
日期:2013年2月23日
SlotDay:星期六,
插槽:[
{slotID用于:42501,SlotTime:10:00},
{slotID用于:42502,SlotTime:10:30}
]
}]
},{
STAFFID是:2,
BusinessID:5,
SlotDates:[
{
日期:2013年2月24日
SlotDay:星期天,
插槽:[
{slotID用于:47001,SlotTime:10:00},
{slotID用于:47002,SlotTime:10:30}
]
}
]
}
]
}
};
我同意,这不正是你问什么......但看看它,它实际上是你想要的...它只是我冒昧地去除冗余
在JavaScript中,您可以通过数据轻松地步行到显示。使用辅助的模型像上面MyJsonClasses帮助你设计JSON-输出你想要的方式很多。
那么我希望我没有忘记什么。
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:
- 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)?
- 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)?
- 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 :)
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.
这篇关于MVC 4 CONTROLER - 使用动态STAFFID是的&安培; BusinessID的而不是硬codeD的人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!