From 7be30c7d0ff55ab692cc8f3176296f12472f25ae Mon Sep 17 00:00:00 2001 From: tmont Date: Mon, 28 Feb 2011 01:03:49 +0000 Subject: [PATCH] * used PrivateActionAttribute to protect child actions * add Lib solution folder --- Lib/Portoa.Web.dll | Bin 48640 -> 49152 bytes Lib/Portoa.Web.xml | 324 ++++++++++++------ Src/VideoGameQuotes.Api/Quote.cs | 10 +- .../Controllers/HomeController.cs | 3 +- .../Controllers/QuoteController.cs | 3 +- VideoGameQuotes.sln | 41 +++ 6 files changed, 266 insertions(+), 115 deletions(-) diff --git a/Lib/Portoa.Web.dll b/Lib/Portoa.Web.dll index 029d8be4e4bde275ba4b8defa4746c04e8632f2c..a9d8e38bc556c2cb950949c80b9bbe91fab00455 100644 GIT binary patch literal 49152 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 literal 48640 zcmbrn3w)Ht^*?-`=h=PslHEEn2l&p+(eIEn2O$RSWgf;-%IW`>U-+gf z_dIiE&YU@O=FFKhGtVw_&-(@$MC8HelTU~q#FPJ~2>fi&hvLZahabv>QAE(@?Q82QN>YZpOFzGLJx9(e&Dlm7*Sm|wJr<%)|~(-lfI%q z?!OpBs!M0mEyxtv_9MXq-yCkl2KfPK&`J*<@<)(U*J1|JQW7$00Fprh1~Hv3{tOfM>~ggT~+qRTY!o%lYM3pO3cUXf06?)eO(! za_DHNRf(ctf=rgjL*GLk3@^(w3 zKC24oK9moQk3cFu5&#`ZXys1bWUj6vwqW4FkiXoYehVemXkb<~K-jb(eo%@_JbJMw z;IZP!DDft!*gK%lW04JQsy;&ir_Y=pNB=*iw@j~76!cI7bYxfwu22IY>TuMn=%6Kx zIu&QebGe!Rn5C^py4tiF@F+--PsyND31~4Li;eCtxJOecO2%tq?>>~52TiHQdS@HQ zJSe8LM}u}@7HGvgy4I}DAj8Z|M23Zd!9b;pK#@KUV32hpvdM^_gh$9g zkjGsz5hWg{#2gaG6mZ%%s0Hl@xP4UxgBA|dLYm3k)|UY?C!>vv(_1*n(iQj&YZABa zgEnqv*48PEeu~iL(p)G(er0DrMtebS&(N(?k&I&y5n5zTFOO4DOP=>7wH5xpM8)kD8 zN<*Gw4y$WGz?*He1Wyc7u^y$vWzf%1Gkyk(Lo~qt=Ww2~JwqHf*^2dEh~<%{M!-)pGLGjWmlsPp zEGb{kNUj_{0`ubSZ{#;&Mk7I?jy|^AfSF{0lY3lJ9 z;ON?+)rNH*a;+}{q#tB+g69r)qraMU0T+A;fK=7=9+c~GIBV1#KA`6C58Lsu^4KR8!;xc5Fm`Y}x{Pu9-{2C56Nh)=5jEq>k{l9RA zxrln8AA{f1@95If?LOBd-df;Q%*clYxc*@YFz_tpA@QKGjVF!Q_?*z2{%uvXT#fcE%6qklG7D`Gy#U9UkCWptB zYAPgh!iaH@H`9gUi|u0jA?_}|hIyM`ZyQv9l9SJkT4{iqDtFet%Xt_^Aivzg@}h#3 zK?!XTH+0I?5S+>{EFd#bTU6{hY{DT0**gWp2@1sFbrRM^z)F0H(ZxP%9g-pPx%vC! z7>wX;Uq&kzE-N4qUCi_xNIm;nX|WHz62y;^UX;))PJcyBQ7wK6a)k*ZpOUCwEd<4W z@zZuNq`|@I^ba_m+gGO~;oB!X0aHOyR-zy;$BBMOc?FXu-x#{rK|fZ@Oe5A?5C1@iupkz6?@ z3j8Pd=gS#ExkvUK;90E4H?mZu50d7CW_fxRY~W@yei`Sxve&9?4D5jHyHxfS!iCpx zgU~JwWgU4+GZ-Pq9FHjT9#N*&40v$NuPdEen7nzTXSq)U?@Ff8^Wkt*J6wjfW~lEf zhBXMnZ9L(PV+JQA+u9_8+fxIwcnH3oKLdCfnXiIwAn~Wue(ea_Kf#?}g}gX4nux=T zB+|c!eypz}FLMn*`PFq8WD8CzVJD%iL^XHvn4e}@t?h>OEo9b=F(h11|C3pL z8#%R6I|o||m4lgu&46^ytuLMZD31s10LJWzW7!O5wgBYy;G^R~GhFl_!i%7TL{ON6 ze%L%6W|#R6*Srn@rU5I1%pxm%8O6A+3YM|8Dk3AZ4RrDA0YK=d_;)3x=iAh|e^e!H z8tYjyRhUzQ@E#2sxDbp_9Cn+y3a)HuZU+}YE-EIfv9IG@R=(R(7nWfAMo8~5;@^V^ z`Sv};yb;k9XM)%TASPPRWMr6!%>v#Q+{7IKkAyQHdH#(<9Uh-N?^&P9dld5y*}R!d zc!zVm5&J0KHc$9yHRif?3yUfn!XSoMZ3r=E4H+lMjktj|p>~3E*(K92tyk7?k->;NUG_#i z@g0ys=9!_oeFt!-+ZZb^k8w`+BPvKc?g~7%@LOse_8|(h<8SLu?&)0s11!ybK5#b* zb8!ajnyPvHf5=r#!;ZK0UZ%2s#H1?t1|9pBIG$rzzZtX+V>I~e00BCt-aR0eP~1XC zoS2>E#Q1({OwT+|{S=-XV0bFZN9b!u`J9C)pC9gKax;qU2f7zOLh*aK6ZZks8l{P% zJZe}!MrMAFsdEy{^I}&WOkbFGsVm3uSUXV<%bL?3^m@PKU_Sw?cH%;vU?Qw5*kLc{ z#|~i{Saqy2IcAZ$c_huZKL-tmf_XmfVTG2_ytCfI*TIj%sPpS7BjbibKS{_2|G=_w zCF=q7AcW^n@I)6M!~+52LwG0;hEsqdhxTFQ!ulf){!_utg4c@tAO@w+?*uV&7NX*k zFg4BNEf|qoV)WnMXQ=g5$qet3mzfdt$)um7Zh~c&O>|H<;s^{)-tHqxtUZnN(Y*+F zJ%i3!&krMRv8wf6Zen;$S7qmB9)+~&^Wdq>_|K5E9uw)~yYMI&(EpIn+RbH0w{uLE z?ab2e8Z`ziqlNwjp*=5^hZ189_7!IQ7sv}5)*d{p z#{ndxz^pNRSU=SK%=T|+ zAbj%EDAl`D7-zK?mC`CoA4aJz=a}&{)F8MhHGJ|`sgfC3We}xx52^@^{}zITPwo;z z*xM1jO(x88ew+t09R+UlK8>r0c?Wel-Ec`2#w1|+@X3ROF^t*GcrgtXmCAWw8YkIZ zHy3*c>2eYw>!4Id-e55sB!<|9h$rt83{{Aw1~dI@yc9{&!H z+G<~E{ADEgh?^H#4s6u6F@MC(fvxDX5PfO@k*G49_@e4ZNbkl%?(V{5I!`#=3qU`v|_VYVP~SDaEO>467k=IcR1lu9);)mG>8u4XPf&2%3@o9ANIh~ zVR~K;JICnd!<*z-J-q-e=!$N5)47ArwO(OKdHyKR;jAH1@Y8#-gUtJ5MskavLl+Xd zSDpHNw#Eq4bwi=DCKW@T37{*a_-iP${^(F6-{AwAV%^%GE8*DST$FP@`gH&W8xVD< zkYEEiXa0n&KF&f&z>hfAi^K-(%M{I}O!EfQa29Czk?utI|K(q zUzq-M5|?jy2PJWI5JyvdC3c=<*!NlJQvx9iFQUri8!?a580WzI9KLBu8F6l!op>A3q@^hSu$yb3M$}27nmKNyoe{u;(Y6}sQ z{~wUdzW{iY;vaF5zTw|^$l>{aoYFqd!r=2G{xJaQSO!u5zYYa2gYm;$!ZD^n4QTU} zyl$${gIYPv@L((AOO&}s2mMJ{pP;TX6^tuJ2K7(P)gLVG7CZQTup#ACZ#D<*8224yNjyu(0Mq{vyEh`Sdva5Yl7;WqJcyS#|2ccyEIQFb! zcsCtZjf91pxO_j3rin3)cOXq6`pSG{|B*3sg(c&C^ek2p7?xvW*t#U*5I+$|-?1sS ze4tjga>P-`=)*og$_AWupo{iV4WHX4GH;{Hxx&Oq#Y*h!VDGadA5KMtnn$Xl$f=0y4Z9*|p&~z=itu7Q1W{yR`6-b{yc7?s zOl6g;ECeUGnpasv_%TlX&vuSDj2d}-Gq|h`#)kr6(`*|a3KOPPfxJv5fHe%DTKQXW z7(wyj$jEOt*>+)re6ENyEV)i_uH}_a4C4YX#*C_@9=E>;^pioK8G)<<^2uDuzUv0oO)0kp)!@J#VWMEBg}V>vRE_Ht!cP^?-D3ptB&+x-y2iPlOs0#G*^;m=W@Yh$K!8GTS*xvcbSw9cJ zIV5xXG=uvThwHF6zO3IX(B4eW=UaA9flqGqJjjF%Qo@rsIiV+(>t)gm_VVi&fGRPG zbiJ2b(0duTra{d0XD~iU2nPid4Y@j_g$9QpOsXoV%Ce0(>_I>7A$9bQCLLK%7nzu+ zXy>@hbhL3X9FL1e*1_H!&Bf}r2Xj_*lGosRRv;>}PbfqES>QeVu%oZ_tS?7ZLIbbP zcc^%W;#LmJXQ1Wo=Xe$mc>f8GO^*AmnJCZSK)5Xr6HWOJ_kBLN=l3p*U_QIc>)hpx zNICW!gh>Kl*2`S^V8l7T5S<-a{?z{{|KQD z(Yn21bHwG_N+Zi9*nXD8Z3RaYy;IYp@eCyEgFz7;Q(~0(MhsOL$^0ds)rgC_xxL4VA zoO!h?g7z=Q=RkLD4xL+WEHinz8972PSbOs2j7YxUo}4t`QbO?*n%YDb0NN4=Wsz7^LfaXKJj@3BjaZ4@%ciE;NWFp zz_EebA7Gitx5bF`rw;v@$989Qzug^SX2>aypA!&fS(V6xJ_jybaSInomq>(v~i-mqiWGput}#d&)CJfzmM zJbL_#oXM|7NdiIV`ty;4SEDYF0$VS<4oJWBUM{x21YnB~y%}=FDoiOUFEPL>AfsU9AP@su;u77xbc~i6F&rRxdHTQXMv+6Gjl13`Zxc*G(8dp&qLPzn$LB53D33HxRYsIT5S&$VJ(7Tj$CQ7u~d)DCn=i0kX8%)HeiHak^Fy3jz7Sq)qulj zaiB3^QZm5OUMl%l3%pL?0|K7~96=`p#|2HgBG`bpKCdshs-T?iDA)$s{;%MTf*^e< z#4>z0)E^4c9!VSF4?-p_46{_%g!iIWH1bI}N~cAJ`=WG)zzYCJ&=ZlJk#V%L=$xW* z`c}~!;5@4MjRKRJiyOdmS26QBP}~prKGIS8Z}D)SNh``4OlYQzHS^mtZv9{xxBdar zK`JR{c$&b60ITWYLAMU7rh|j70_Q6Rb1xnneCr^S-X5}Vh)KqA+{$qRPZD^RKuh3P z1l}U>X9E9u+)Kxq6dcNM@KCN>FL2(_osqM(u+G+4S;aPt z@`Q@L(9C`MUW~$=ibfdf1p?Oqn)Kz02ISu&>0L;h^!EyG#jIq>PpPb{H0f)VJ0m9D zTFI?ECh6BJU#cvpe^tIw&|r_ntYNH&3jt4*u|Clr>#HS)+coLAVcgbVhP^T@Na5j3 zKUQF)z>5X$05oaeaF*l^fq@undqHf9d5YM8Nms=hkmj)~rzd0Ed<`=CCXK1$TC)UR zP{reTg`{t+`dXDqKbG_pfOvznid%0R!EJSqV9Jdn8ZZlXj9{DD1sI_}jM!^VrbQ#q z7&)1~1UQv08QC#1LSG%Z7q#vic{}odIr66?8zgPgyCd0Vt{TN0whMd`u$&f-X6s!$ z`b(pu^sUjuAuZdsNe_+QiFm?O&2~~={XwXj=2o+|udGg2o3yLC!E7L9+k?h@t*V-8 z$8hQNF)aU0V_5P#$FOD|Mmk7?;+(U2EOY)bU^#sc?GGFpj2M98KhOU3^xh92{1xW)Uw|GRLc^2>i$t%O=Idl2}9aC z9-XJh|D(1+<{hlPzQLSLC)CI4=h6E5CG{qK2RWbwET>=Ab1y;-Tx(ndYvZ&A?)x01 zO=<;fkQr*yiw*tIsyU&ql6|IH6L@XV@T$!a+|YO>y&YvU=q#b|NLdG6BV|77M|iiL z?gyshn?GFdaVgW`fw}BGDKl^?$e6A%CBHMvJO^oYXwrbU=Xz5$=4s$vFD{#}VUvsX zZitjE*V0-Uu%W<+z6Q*T)~coK7StPp6+R*L9zq$f_jOYCjPQ)$T#{S(J<2NaoG94a zB1;kCLze8nLRo|xDW`D3>n`;y%M@Wuu9`BtoJ3fOt6Ut z^DL!S!Db6qPOAhv-(a3YC?nWPV3*Tzv{q!vf{PdW>!E(gzR9@Jn1q=8a-rOTveU4B zZj(Oj0mg5heHUXGtCRkqZz>d6jPXAu#!=XolZf)<_R{7LN3Z?Y@xW`pjxJ!O+|uz4`GoP zd$*`oMeq9SF|JnNEI?oIHpugv;C}$$M?i${3>FxG!wdXcF^!G+wR$?IfB;tr#Mef_ z;g*6ifDaec2tC)D7P0_Ghq?66;oD%fiP3(f-wmIvSJAM@R9&OqNDIE96>ZV~+>9?(2YS;vEIW^g#Tpfd3IVYwYX6iS(DkdQk2fTNmQ|djV&SW%$uJ zhNmR%4XHkAbWL%IQAM{GR{(OaF_-GbMye{n!QqE}> zm=btt=~qze($XISK3vMR%F38#JYW?qE!&HH)?^i}F58C|uP%EL@P@LN0hP}6@=8w? zRh5qcJifdhaAEl=9`5!1MQTJ$DjqZwo|)+#xPNdFV!3g(7vSb{>hV8_Xms#+ZubzN zNf!>e4{^oB@eJpVZ_yXPUWne(Hu@__qs2CMhkpd-&bI{n^5CEP2u1;Mt^_XEq| z>(3v-lv`+bU^RU4D>n8duqe$LsmlHkSc|Pd2v*LN?*zU9&!ztMdjB5SmizwqUhlsG zasC#B{O$FA68IjlE~%$_JDje`VLPygxK%JES&R+|)=#CuAK|@-iKCg#W~vI_FQ>tb z?F~;4J}md53R@K11*}gfRSTnOr(kadm~u4z%Ep*-G`*lG{T;z)uqM4@V?Dubzz*5i zHNofLVG9sGK!g6R!IyxQ+So0@*Wh6}wBWLx!Gpji3bvOX4}J&_yG*!jrpnlr<~Vv$ zQDPkGwFLc5u+4*iUT~^bOGR3wvMjXf8+RPU$h zG9fq9JCU#Im(!>dx!z{d3peXm(5*IBR(PHMWx5WhH(WNN@CN-#`io#+_8(vP9DRj8 zv9Z$%UjpWrvmd3iO;n^X|BAw!^-VO!#;n2}w28*MD8EWwf^DI172c(Pm9jYbXA8Nj z@IL)(^l=V*NWYpYaIVi~dkTN9UqcIQ?4`nA>ffZ3h0A7oe9XPUZ_zn6_LniQ1iwwc zv#~|-Wd+yL$2N9de0{+ds*x5p)2qO~L!~x0ZtN?;>*(7!OeVTq{L5DIwmh`zj?1O(_0QznwdPzrEpwxWl?bA;2tPcha4%dUw%-g1r@B%Dd^1 zjWOj9Y5Y{Kx<`2ah*sGcd*OTOyMiejyq9jxVKL)gdQdRsU+$w`H%%6xpLl4nUZS2J8Heh>ftO;cg(;sYX0m>exH*9Qabe{fG^2qY> zWq+GsqipOV!KT~TrGmBE*w+QS+{SK0j|4-4fRHui*I9vn48OZ405 zV${1tVgA>mUo;+}yKIaldxU;rW8EbSfjw($a2Vm)cmY zbOW%jC`|hI3%V&sxz+du{Uk?u3$R@|%5AW(7woc|N}r*}=^Y!pyL20{LxSz4PXfD* zy;LW`0Nda~{Rx_`F#oHi^Yka_i#GNS`tT&R+So@Zdy0B(%vZJ$*yVyLp1-7Dt1|HX zrSU5|V3%=>`7|98OhvfQP=N#=Zv{BQeTGUECNa^oR3n(09lxfDg6$=%Y=!n~YPYd< zWpVm7-D+c(mtBamS6ub>(cf~|pNxGJn!{tHxI9laHpcayr*0c#p1+~*3buvrFMHqk z4SD8ry)E=m*+<5U#NU=wnC^Lr&akm3%L1O4X@y`)>Q|`CE;~?G?0JQLoGUwlUZq0{ zqm|{;J+D#CJm&djU}pfEV`E=N*&pfh9JUzPtv0q5W&7!s9CiV)k8NxR$_~)P`HJU` z@)f|Y5^N9svb@vtCt566KfTg$q4oxK3AUNuYq+QAO{!lY^)PEdB=L)qnJAON`MjN}MYJu@S?NeA_{_%IA?9X=D zEyu@klJi#^dseVRHf3P^3hjL=P(E4a*!$qF(Ff&u_^zMRpCAX{g2o-RMlnFVjWDRF z$e>dt#|j)tbGpzhl+p`8snaT<9~~|#!Z+0HeCD$eX@jmpsgwV0sk>G3-ITu)4l3s* z;lNO*{gTGD%Mo(^NAf=pe7Jz?YJ(Zxg0zm4A16nr0?8jLP|>)x!8*}#9>VnFgvQ;X zqC7$JRk{gjgJ$P)9NjLFobz)~$N3fW+~b=H0VL(dnDhRYlZ1QtyJ~* z&*8jomHw5URr(nH75ZTjuB9~aJX+W3chWB&-(%(Pmr|vTcZ7baXyX&fSEYd=T(?}{ zaRS|AT_HIPbsFPJD>*BMu!hF~8ZZN5)MCrXVU41 zfEs;TIzReqEHpYf!SpJBiby+OxVihHO5Hhb%G-;XgBl%0`6c1Nde(4W$M8@!!&sD| zo6m-$+H#kET6)t_wZ3^&j;hO}hSN*eC@VR?EA(vPI!-K^M&;awd}scu8LBMm*lB#j zUHIHBQ1$&mNgoXrhsTa8RrA`dPbIk*>yt*x0u@v`Jhztf58}clfH@S#iDWU(A&YUh zRE$%`8k{CpQ5nw1%JB{5L39p2wYc#Zi+henoF6vgoNyW5e+=Oh#<}1L6vL;QnsD}Z z9X?H<9E*FS8MqOuLCIL8zK&15F@wH|XQe)as`M(IPgKVWtQR;*U=!drY8H5=z;gvA z1-1!XBd|wczram^mw7fzdaJr<_XG@5wtP!p};2CQSseB8U5hE+#MI^E+@OMv*+#b{$_ZLUJnzp#I-1`w-P+94n zBs`k{77Uy4BPHqW2_r?rx$lp!=6R@o?*|>8e_QoAYk ziusYgGxjFnL$MFddTmAlD50_Ad_!ngY?QAF={U510xpu*La>AalXGF zwc^y{IXt4p-{T37TB%g1?Bhsx1#h$b34-agU|IN z3-ldGZ=-uXzaROm|6b1nBTm(JOU^;v7L)!zyvwWq8mRJqtNNdyyuJEkaKKj}gU@Mdj{kOaMR1e$@9Gi3mo=7clja{2 z4^Hxq95YYfBl>CbHjX(d*z8>}rZqTLJAaJKyV0wH{o3j=D>Rm;JJ_c6j=2QziZKg} z-S8n-204E-;I-hxKI8|%N9308X$r^xFPQY!#6J$6={+g_3?;>)Ua-evR(xc^D|UMJ zsBHyL(}=M*>u*TTyLP@cc3(k~E*V=AIwbdjJesG5*3du3P7NLK6pWh{>h}&B_YC!W zs{uE8UmZOUrLE&SLtDMpxaVlA_mXjO!p$ts_ttiB zv^8{{DMhlo!d4-uaze&Fq_sX`8)H69{9o7^tGV!QUhh%w>q+8s3w;eh#5|7l3SRdYtT z$~0?F)jS&CD<Z{>N=6$u_KwEqU z*#vr6spzmx`)%z@o*tat{UFRM&VAvK#&@vI<~y~IhtD*N>YfWXo3Xmb!804#A+vj} z|4fR6heV#!Hq<@oNovvPsgY8&j=5}nqi$|wyYZd6u1JN(-YIFWuG$_MrLm8i|sn_dZ#6rFS=a z^vA;O!v6!UyMc>QB5=RJQ32M#lmNHBOkkhDT>|$Dq#&1ifk0zd$PDbWGqBfy)G5Ud+ATBXCNTX_g7>6L^!rT>|$Dq!Qs%ChZDbRwk_o zq;e@0II5gEPm%PlK|&*t1`CbADFT-XynHaz?~?R>fqg@m@+N`11nw8;IgTku37m2q z(<~EslfYd9X{fX!uutGk0(S}AFK}4})AR}4U&%e9VGLserwHs5xPLfPQcUP$y)2c$ zT>|$DoHBy*mkGQ{;4XnQlJjE%ulGFS`N%WUd#3js?^5pu@73NBc&EL|Tx4Eme%-v) zyuee$D_0!92zJN4?Y$<@&tZ$pa#2e90Abs z;1fA`8h#`M@1qu!1D;WUpFTjEbIuL%o1cy0S90*1krfa~!7GAH|MkKjAZJy8={Ncq zR+KQ!2!S;M#|u1F;OQkR45CE>zbHAa0fUtN6G%Usw7KaJ#Pb zCx9=MvQ%f3u~bV0s=mKj&XO+~{}Y_;-8Me0`LVZR&E5d0(-54FXwaeoEq@QEBt>)+ zpaz}td$|;!x-RaMKKCIP9p(zi~?Tr!#FUUK=^F|j7K5T%{Xt- z@m4Fpsrx0oRHx(JRE8;>zG$>U;DtDS(Wwnk!@ol?1nCT*hIc83BE44Nk06mo_W)35M50UB<(W+45v zz-RFmriS~g(~+|ez1ML9a|Yn^`1T3j0|eCRMSN3Equ&DJd==mB(s06XCep7U($H{= z#PE-J+gGR8_?=&R1Mm9k^twPpI~VCP?TdhewF}VZD7^=#P1SlYU|jzYIpg&8NZ06> z0@msOhn(?xzwXxyjP0I>JU;JMZ`3@+yw;rWOZl?CZ~JcZ?e}@`PhgzjpX$Hc?+vsB z)&%N;?*+pJXBK?FV0XcU(APt&!W+X=BbP_6j*Kr{RrrI#`wLr(I*Qg7Z7903XiL%e zif%9ZcTq|4amAiKK6i8f-3Z(CxH2>vYcdL>%>4yvN-pn4yLyoJ9wYBxlIP}ELfd@I z$ekCYzaN!{H!^WIFpy582H`hQ;wx|t$|vvqcT*w5SM|9?{4~hR5BUqydqX+l?uXMi zH=Wb2J14zO7UNAKQFYOo%XXEPkv9kn_dgCJQoShPlfl`c#q)xt7M8_pFBPE z6?qonUpr9wH_)SaE0*Bnet~-pf@ga|p4;vG?RNexHvMh(^N*UUf53jer)|I;9?=K( z^F#aj5uTH1r)LR1t10d6p(nhTVfTGEK2PCi9N)vUSR0PBta<*S+B|=i*5x0m_4_B_ z{js6i+y2w=nWj|*X5iDTJ>i`Td;&ga;&Y33M(_!3YQZhqc?G}12j7Dz_>Fd`;APaE zM7#YjYst_gN`_w6F2|EUH{i23bei@@eBQ)o9(e5ymFWK$nxIj*Su?{oVJ|%a^(JU# zcrtx$_+Q%ka7uqIyjl-LMrx5rv9{CGt*?w+q*n#H^+|=_(a*wXr{_+5UV~h(X$QT3 zK;9qmc@v*W^tS&_{g*}m)nCWwAU^NobExP&I;&7K@Db0C!vU-bVR++0__!$YO7SVj z=Qw!l3aszL@fk${Z8T1HtI4a4!PH>$0iNOq zwzZ@dq^-3O{s``ilPjlox3weR#cWo#v zk{cPQDW!A8b7rz7Yo&W=cE;*NP8W3KYIjEGN+_Du0YefE zvY{=>q|yVl(f&!k{B}K#Vy*_%@WLCakiCS%}SB+!!V%(D^qEA zj?@z!D{&-==JTvv($8Jn;xd4#$xLd%bdX9iVe+*dxtp6iFHE&$+1id#_!(uOmXS#1 zd(@Qa0xKAcd~9K*T__Qg7Xx|36eCxcUH#$C^f+T>kGISuu`^nbgi)@Xo9gUV3IdMN z258OWDhV0jXHtuMx>8M9e93uvcXohXoRw^EYn53lbaPUjE3>QelmjMYN?C&2tW-{h zW+gMZO00Rdnl;_2OmfyHu7RJWi$7WnE?SQmNLAIIksLIXSt*aLLV`D=Zgj-WpVKlW4rTbFH-+ z;vX@3`8IRbG_5r<9G^)-H~ar((P@_X;Dumo9dwX%h~2^OjZq8Fg4p#O)VA8 zdG6FKQxw3V?|Wa}2B;R~?< zWa?yaKFwRu+)t}f*9_ICTT)%@4nHSZPWkAi?d=v~O{HeX{?$^KBZFE7ctFRoG`psf zOS57!F6ZEAEU(@C*yX%bF6)Q^clb`TI5HzfUPMDMR^LmA5u!NcI%U zXCGnWF84Oj@>Inc>#%TUG51;e6#mV}`MhMYmvstwInUv#)??G9TB(i~Jq+;bPV1sh z_EIqP#t#>Oi7`5+{(JuFUYCSd+|uBpS^ zPpgG1!+yX{v+wHeY+2SoN)?1TbB5y&_2Uhck54$cFvUR;3qXslfrR;(g%))$ z?`X@?oaFLUI}F8%Wze!@K^wFfgNYvlpW2fq(kVi$qm0jvWGXqgq2@}qRme|)bm6M*a&Y5paA=YHx^1nzZiqGW{Hbe^d7#1& zrLog7fGm>D-nLVY>=$CtnKwUEJm(3t0}vVY%*?da;dow>J~`Uu(U6Kf3X*7Kc$99W zsF}UCU4KC`oo!3DyK*FH3pb574zf^X>P}B#U(kldBp;Mw2F`fn{oeWFL z^2?&7!dvRjMY_`c`Dr*L>Ay-fE7dJbWxLaGw+iDxL+zT_w&uY^?Fe~#sy($biQr9z zBGf2Mjxrp@x)lrXDq6J4>TYkvgkV;zD;X8rWTv+zS9V$%to9hNtkrc9FTJ+0xdn4( zDO_PkGJBMe?rgg!DhrTXR*3DP*$DF9iY+0JHRh5>^@*!-JSDo5L?gqa=%h$IvMj?g zi8G5WyKyxSd6Opv7)iC$%jf5^rdwDK!7VpOY&Q-Oph;JRhqxEp&y*{=5Z><1DEszw zmYP<;k|nvMix*I}b8yYQ49%O>2BYodG0rFJrma|+qgQdd5;#xda8sq?j`IE>XV8+* zhX`s?HDNW#I?)B^E=(zK!zQyvkKYavI3D*n?YyO zX)o|tc9X5GOXqhUNdfnhg&RnxI;^#+PcQ%Uiijr{Tl3Tef&`0HAYnT%-T|;&jx>&u zBe$8C@>H7lA`lKv7{1KjGf;C5b*UR{a@iT`O6Im?D`CX;io%9(CpkCYSut=I%B9MD z?AnOxS;vey&&3Ej5$dmm-xX$R`ym@b#<4M5kWQ^_v$|C|aCRy}%S4OVt23eSnT8lp zhA3BGac)%N9yQ|{^THlgX4`!WZ$(&G{tkNG zxO~pClN`yUvq#C*2tkg{RCSKZcX4$K%&oZOVl*c&D|2BA+r8F|jHi=sbTK%poyI)3 zqstuDN0->Vk1BB5WLf57_bsa`OPNC&ozzivodU6nxyg0vNI<%h#}wmEcUhZ*HRi~U z;*C~qs-uc>m9T4cIAI^aXMU%5x3$vhR1eQl6;>}4N1)P+oXqwkjv89!7$GI0pXJ$8XyNqu)0B+PPxc6J(X!m zw{`JGkQE}_2DlMfQQhm^3Zday&rYNz=g6I$<=FJO_JG~a@iQq!PEGS3tj@hd#{xgE z8&PHMOpL9iJ=r6yx)EJS)Y_HIWG=!?CW#0T&*bUX%C0as{3<-myF-Y9+HhDcBKkEQ8O2fu8{Z-tFS9V&E(=ntcp10 zwgW(G`GvR}&l`u*jT1<=^1ew%KZDVhLqf-T@>LeI{1^q^?n@dga5TIoKRsh<@kKc8^uu(UrtjC}*QiTi9E+cDH1YE|_L@^`zTY zt~y51;&ie#)sZ}w=+odAy3;PiR^ZVE zGhxC<6;4kr?_Rl*W37Azm4^{v|C~EUaR!Kw;lK%3CwbA3Ar5t6sy(?*Qu(84vMX{u z6fJLS#~n+)u^G-KSw0Jcj@4Y2AzLea5YV(dla-@VzE5KkK9+W@SRGNT-G%InZ60d7 z0cL!Qmv(Ll5g$ti4xBocwQlTjybh=8L(kl_9cH#`seGp_HG3TOD zR|RG#v&vQnr`1k|*8#@ZOV~M9*V5)r%u^fy;KoYrtYs207qz35A5TRGG6S)9UQ$KoHBqji(tbPKJd= zxQN?O9P%kc;WG^JI6VH6UJ<_rkC}Hf2Pu}fdfl>!R;$2)v zCUaA85jiFqsLGAwu#i3N{Pc{DF6fbivF1*k)bOFBoaax6U(9nutihV&Lmn++I$q%}8hFRJQl96K^Lm+pMk}+*n5|;$X>i@^(q?n2rlI^+FTE%fK5{RtE>kM;MlVWtax^_$xzcyYafeS*q!w1GQ$C&+I-@~R5N?khK-asrImBKLP{d>7$H9EZm;3!$`hHpA}~ zP-Fg3Sy>U{+lignnIXt_?uz-92Of7kTvx}y_&o?FwY0e8S>UdoFzqI37Ib`K~zJ<6aS&kd6T(mIH>f}8x zM-cfTg(2VwUeUn)!)7tUNLXFA(j{(~A>D0dJLC(eoCUz|OzXzZs3XTPw%KW(2#;xT3G|AmyVJN^-tX*zV!; zwF@tti{u)lLvRq;6wad5PEU?7B;PqsWDDdnmw_%!UW9is#aRq^f6{qj&sny(8t;u# zY2GIBj*FS899atyJ&0YToGYi@)S4`(}vAi%zMM+AWr+1witi&sGl*ahN66V_C_)v_82L#wNV3!IBRGcg82>hfR2NSoEBgjl{ae_GFQK4K>e?aJIXlG0$@NQ@W_U9Q<8EKNv`xJdqpX0>CX}CY zYtrd6x8fG4aq@(vOC^ZnVawN`#>0EU|I$6)uELEGZmJ|NMjiN$ zRR%OMT8@$!eq$wu?vkDaOv&d=3f5)m#eV3_htRkq80(lJZSk1Jf!PO``1r#mP zbQYpm!a9Xi3}2<3{3&I1_?lY28*bt7Q#V9q(~iN9e7)edo~WP=UGG9CvqS;>Y!T8a z{7Z=${qt#q=RO9GupcW~y#>&qeq>n%Mfoti5%R!b&#EE zH{c6{XQ3>GFW_a6&ht4QKdmtydai?fcnJsebi$F;i=ao`L!x#o>MjBw=3EDza2-yg zpP##p7H(tc97u>84_n>^z}UiCSlK!W)|W5AzhB zf`8m5{~s9`KLfvH=&fPC1}waaCnNK}2su0^ECXAYGl|K|a!|MtU$9()f1+{@S|nox zK4VBLSZrJU7lB`Ze=Es7gPPGdwn3B?FUE5bxUzM#6;NSZETLQak6!|>ti!0)p`}Jh z-U+HM>6ywU17BP%bo#7%OI1sR4lmE6m9xP=4KFZYvv9{R)B`}$Fqw$F`a6gYqGA_ zpshAZaUBcNT!>trGYVgU+`KiZe#7Pdcjlb$+;P%7GauVj@ctF2p7V9`|K#HH&l)mu z|0aL^V<(?=_lfgP@Za-=rI!}J7(B%r)3oRX0+U9JG*678a}6_^lB|?3rdLGUq8(BE z+dPrznzCrORu=8ihfzfZh-L`U4E!^n(e=^3{^GtXg5=@krbq-olc^ig^<~k%tF>X2 zuQ&|<7z=&_M~Eu$(=%Gc8`Jej#4t;U*$FJ6h=(*CMO56k*+e!T-Z&!=lCz_I*K#%< z!5Fyr=txx*Aje6IXl))7Rdh4rF;N~cokG}l1njtWJXf1(wlcUO5YxeVD^mEvwdNP> z+Gq$OMf`q3(RS3tFAr2kq8$-mOpDG{f=PcWbh85dD^M-kcU!bA5{MZp5rKTr#|}LL zoraien~esFxWT*ee?gIsYMhGBaHUh|Eb{L~ucGHfptcHDn-;0?#F6wBK@+KHDnO{5 zs*LvCZxZX~{xFXL3ZhGp`4EOJjB(6o6xi4>iY|$gR|@*>M?FQ45pEPUHnLV8Rr-Du z1K{Uz^A~UjcSrjkkM=#Kn|}1!uSm8kVIPMO5ikpq5y2Cb&!`-`U^nZtf&n^&A7Jpr z0lZuX{{kG$u0GQ#VP#`gevgQ}j5k%p0u_I()ft5h5Qy(K*YOZ4HN?ZP91 zpU6-GMEgGCNzwOTE!wZ;QeNSUyg)81V2;n*U|Gz~8toXi< z;57Qf^798C4K9fdhIOVD_n*tNx4%tbhu5b^YjlWE1i@jBEI16fe~l-I3?261(<|5| zpvroN_5j^q+<&!LyO=Au`*}WKb_&e_GX|53RD^xLXn%jSAMPj;;Z_ENDNh!(G6T{? z;IUwE(e)9J53ouj&-uME{L8tEBOVUgi*T1?zljiId@_%E|Bi?WsqIJK$GXR-`~BhZ zI{Tjfd(neonkR@k4k2LLy5EQC-ydDC%Y=;-_&khC4qGF8#{k<(|NRhdC{O?Xhk!lG z+;$5$DH}#+P%xQ8{ZB!Z%1EUVlHSN@4#V=N!H-7QD}MLFtBT@Y6!@~hSD~v&gd2t% zg74DNXo*(Hih77=DFm%FbRRm%NvJFi0%*q`185c+cr#-7V8(<=*>`_L_Yp)v%1aof z_e$YZbXy>H{QV!GhoHwl0LByST2@})o%uR73`zn4<7}=vSpLP#FnE6c@X}3Ur8R z?54-^=tVFZScf2fMRa3;ZLR;!$_Q)?KS|40U8(eW8-(6i52FmQUS$c=hiP8?{P-~Z z3-;PDwa9G@M2ltU@5XP@@@xSKkH+0Vihyu%kn#qhs7dxLVs9JWcv>Vh9?R3l)6}}b z6n%Zc@vPC)c;Sh#>icd7ScQ_U5UwJc@(-PU;DzeqbE;q$(T&aA1%5(M413C6%P|9x z7KU3*^ajj84!R52bDV=w!g?6Myp``4NmtlqL{sc+cp$KZ0AtlCbGlzgPjtsVIS+#& z{O^}p?a}4o*8?K{r0B*rZX@L^k5Cc*m*te#zl|V3P8$@|&Vwjx$hADZz5+Dpyc`@Oh zQ8YZUAju}v=h5*83*yPBOH&*!1rcvWq8qP`R8~MWfV`GH4pBjN5WlFzTp>{3d(!q+ zTTuriB^>iXer3F@C=l|{9*p|D@PA672VsGsh>k!BvS|^RqR)u1MWWG)iV9f`4n+RH z_Rc0Wt}2S-Z{AGI%p^0WV^b6-!xP(uV1}7=Qj>y^(oD6B){lPRVnq9q+CoZVT3ZS( zX6CKjh&u@=b{nvuU=}X2P~3DOSZo&s7p5D{LK+Z3H|pT%BLlEsD1GZrnkK^x}$xA@w7kR1&Ocu z@nuxb*eP9+p@MDNEBQ=Z1#W#TVPje~ZPMv*+ipteT{lz*S>mb@ck=StE@Xf>5&=x) zXs--I{}}3{{doEm=KrZMkHwRgG7_7t$2I*SWF{JWe^LJFkz~@uxs)hHtsS~0uov1T zKbK8*o9B%YCI5M`Kw+k6j>J>qz^b$ey5mdu#?Ej@drchtff!l{>SiEj+ppjz2{999 zmTlRGtwe^Krr4KZSL%N2qQYiSyRTh8O=C|GCj*?LstvUjUh*OIlQZ;_*WkZJV?2b z6`D<>Fz=o;Mj_D(5(>W$eTC%yJ5QUg`5Wfb*;u*ofRUF4 z^5H9JW)r6Ndm3(d0(Dn}!4bM5W5lCZ^B-Iz6G@HohYMFKzOWP}&+=QT4O^b29tWRxxOCUt8j7`<1@^xt~l&}^gGEmjGo26@h(H{;{ z@@$Hj5JUlCYW^$>&M;`*Wikp{11fIeeA9;|omD9M4qdQ_>%-_!S56zb7%3x*$Zc}{ z2RAS;umfTFXr0%FiMZ({fM-v-_XD24QY&*abUeQ^E>hfxw@LKK&WPFsaY;~P$Z z&0!vGVo6Q6L;T}oFB5O8;dw#Adoq5SKlpkjh|7YBN|mLfXA<7-seRSj-l=_aap2lSAH7)aR0?$>&ut!pE&Tzy?aBH zAKc&2V^x8NwOuXGSy z^`DzP^$0E;Tv(cA*QHZLcx=;^xjEaAOKtwz;{`MQjUQh9ixkjac^*5Xdd+?yVmMFB zpAY1#-iv%+`w>pXfsBrHvPSYG3&C&j%YUsUb(rPbqg)^6_Yi3vYpMHxy1fY<-@3HN zUYPEXIusB09L;f*T6X2*x!=)Cu=cegvG(0G+3b`JMxY=grujrV)%; zFy?(L>S*!17dI_xFOjoAe`S`s=YXlBg6t>a(Virqm+NV*h@6fpwJY&g@Z2t`QOH5d z((^r7ZU?7KU`4?Q9SwFzO%MR!F+OXl(JnGhVf+?L;2P6|c>%l1EAF>-`~jhg3OI^- z;uqoeQl~Ek34~ij8(mr8%og~!(xMl~DWmDj^rHylJGQ9aI}h89QSfU<%l>v-DY})O pQ`Y7HG*>W4L4|p!5x|B0GqJUu;QgnM?=UwYcwOT9@c7?R;BS9Q)UN;l diff --git a/Lib/Portoa.Web.xml b/Lib/Portoa.Web.xml index 37ee86e..0394886 100644 --- a/Lib/Portoa.Web.xml +++ b/Lib/Portoa.Web.xml @@ -11,6 +11,18 @@ + + + Enables you to dynamically add filters to a ControllerActionInvoker. This class will also + perform injection on all filters that are annotated with NeedsBuildUpAttribute. + + Adapted from http://blog.ploeh.dk/2009/12/01/GlobalErrorHandlingInASPNETMVC.aspx + + + + Overridden to add the new filters to the default filters + + Signifies that this controller can handle errors that aren't handled by @@ -32,6 +44,18 @@ Executed when the user is forbidden from seeing the requested page + + + whose lifetime lasts as long as the HTTP request. + The object is stored in HttpContext.Current.Items, keyed by a . + + + + + Matching rule that matches when a method is annotated with an attribute + + The attribute to match against + Model binder that uses an IUnityContainer to resolve the model binder designated by @@ -54,6 +78,11 @@ The service provider to use to resolve the model binder + + + Controller factory that uses a service provider to resolve controllers + + Gets the HTML-safe string representation of the tag. Thanks, Microsoft, for making @@ -91,6 +120,12 @@ The text that the button will display Any additional HTML attributes for the input tag + + + Indicates that an object needs to be built up by the container + + + Service for authenticating users @@ -203,6 +238,13 @@ not be null. + + + Flattens a FilterInfo object into a single IEnumerable containing + the ActionFilter, ExceptionFilter, ResultFilter and + AuthorizationFilter collections + + This class exists to get rid of the SessionState and TempData error. Just google it. @@ -261,6 +303,17 @@ Configures the application to use log4net + + + decorator that allows you to explicitly control + how the object disposes (useful for 3rd-party objects that do not implement + ) + + + + The LifetimeManager to decorate + Action to call when the value is removed to dispose of the object + Provides an interface for interacting with session data @@ -336,6 +389,21 @@ The base class/interface to match against + + + Gets a value from the request and casts it to the specified type + + + + + Gets a value from the request + + + + + Adds an error to the model state + + Error result factory that returns a result suitable @@ -359,6 +427,17 @@ Session store that uses the current HttpContext + + + IControllerFactory that provides a mechanism to perform injection + on the controller after it is instantiated + + + + + Event that fires after a controller is instantiated + + Controller for handling and displaying errors that aren't handled by application code @@ -367,6 +446,11 @@ The factory to use to create the action results + + + Uses an IUnityContainer to create controllers + + Call handler that wraps a method call in a unit of work @@ -405,6 +489,18 @@ Gets or sets the currently logged in user, or null if no one is logged in + + + Provides an interface for identifying the current user + + The user type + + + + Returns the user currently performing actions on the site, or null + if the user cannot be identified + + Gets all model state errors as a line feed-delimited string @@ -513,22 +609,6 @@ later. - - - Uses an IUnityContainer to create controllers - - - - - IControllerFactory that provides a mechanism to perform injection - on the controller after it is instantiated - - - - - Event that fires after a controller is instantiated - - Negates a matching rule @@ -564,13 +644,19 @@ Reads the app config and applies the Unity configuration, if applicable - + - Model for displaying a paging menu + Gets an object from the request variables, or its default value if + the key does not exist + The type to convert the value to + The request key of the object to retrieve - - The model used for displaying the paged data + + + Strongly-typed model for displaying data that should be paged + + The type of data to be paged @@ -627,11 +713,114 @@ Gets or sets filtered record set; Count() should be less than or equal to the page size - + - Strongly-typed model for displaying data that is paged + Gets or sets filtered record set; Count() should be less than or equal to the page size + + + + + Model for displaying a paging menu + + + + The model used for displaying the paged data + + + + Gets the data needed to display a link to a certain page + + The number of the page to retrieve + + + + Gets or sets action to navigate to when going to the next or previous page + + + + + Gets or sets the controller to navigate to when going to the next or previous page + + + + + Gets the starting point of the current page + + + + + Gets the actual ending point of the current page + + + + + Gets the theoretical ending point of the current page + + + + + Gets the total number of pages in the set + + + + + Gets the current page number + + + + + Gets whether or not a previous page is possible + + + + + Gets whether or not a next page is possible + + + + + Gets the page size + + + + + Gets the total number of records + + + + + Gets whether or not the menu should be shown + + + + + Gets whether or not the current page is a valid page number for the given data + + + + + Gets the data needed to display a link to all the pages + + + + + Represents the data needed to show a link to a page + + + + + Gets or sets the starting point of this page + + + + + Gets or sets the ending point of this page + + + + + Gets or sets the page number - The type of data to be paged @@ -667,92 +856,11 @@ - + - Matching rule that matches when a method is annotated with an attribute - - The attribute to match against - - - - whose lifetime lasts as long as the HTTP request. - The object is stored in HttpContext.Current.Items, keyed by a . - - - - - decorator that allows you to explicitly control - how the object disposes (useful for 3rd-party objects that do not implement - ) - - - - The LifetimeManager to decorate - Action to call when the value is removed to dispose of the object - - - - Gets an object from the request variables, or its default value if - the key does not exist - - The type to convert the value to - The request key of the object to retrieve - - - - Gets a value from the request and casts it to the specified type - - - - - Gets a value from the request - - - - - Adds an error to the model state - - - - - Indicates that an object needs to be built up by the container - - - - - - Flattens a FilterInfo object into a single IEnumerable containing - the ActionFilter, ExceptionFilter, ResultFilter and - AuthorizationFilter collections - - - - - Enables you to dynamically add filters to a ControllerActionInvoker. This class will also - perform injection on all filters that are annotated with NeedsBuildUpAttribute. - - Adapted from http://blog.ploeh.dk/2009/12/01/GlobalErrorHandlingInASPNETMVC.aspx - - - - Overridden to add the new filters to the default filters - - - - - Controller factory that uses a service provider to resolve controllers - - - - - Provides an interface for identifying the current user - - The user type - - - - Returns the user currently performing actions on the site, or null - if the user cannot be identified + Disallows public access to a controller's action. This is basically a more useful version of + . When the action is accessed publicly, an + with a 404 status code is raised. diff --git a/Src/VideoGameQuotes.Api/Quote.cs b/Src/VideoGameQuotes.Api/Quote.cs index 0793e68..a127345 100644 --- a/Src/VideoGameQuotes.Api/Quote.cs +++ b/Src/VideoGameQuotes.Api/Quote.cs @@ -130,7 +130,7 @@ namespace VideoGameQuotes.Api { Game = Game.ToDto(), Created = Created, Categories = Categories.Select(category => category.ToDto()), - TotalVotes = Votes.Count(), + TotalVotes = UpVotes + DownVotes, UpVotes = UpVotes, DownVotes = DownVotes, Score = Score @@ -188,12 +188,12 @@ namespace VideoGameQuotes.Api { return years == 1 ? "1 year ago" : years + " years ago"; } - if (timespan.TotalDays >= 50) { + if (timespan.TotalDays >= 31) { var months = (int)Math.Round(timespan.TotalDays / 30); return months == 1 ? "1 month ago" : months + " months ago"; } - if (timespan.TotalDays >= 10) { + if (timespan.TotalDays >= 7) { var weeks = (int)Math.Round(timespan.TotalDays / 7); return weeks == 1 ? "1 week ago" : weeks + " weeks ago"; } @@ -202,11 +202,11 @@ namespace VideoGameQuotes.Api { return (int)timespan.TotalDays == 1 ? "1 day ago" : (int)timespan.TotalDays + " days ago"; } - if (timespan.TotalMinutes >= 90) { + if (timespan.TotalMinutes >= 60) { return (int)timespan.TotalHours == 1 ? "1 hour ago" : (int)timespan.TotalHours + " hours ago"; } - if (timespan.TotalSeconds >= 90) { + if (timespan.TotalSeconds >= 60) { return (int)timespan.TotalMinutes == 1 ? "1 minute ago" : (int)timespan.TotalMinutes + " minutes ago"; } diff --git a/Src/VideoGameQuotes.Web/Controllers/HomeController.cs b/Src/VideoGameQuotes.Web/Controllers/HomeController.cs index 6dad0be..5eace87 100644 --- a/Src/VideoGameQuotes.Web/Controllers/HomeController.cs +++ b/Src/VideoGameQuotes.Web/Controllers/HomeController.cs @@ -6,6 +6,7 @@ using System.Text; using System.Web.Mvc; using Portoa.Web; using Portoa.Web.Controllers; +using Portoa.Web.Filters; using Portoa.Web.Security; using VideoGameQuotes.Api; using VideoGameQuotes.Web.Models; @@ -53,7 +54,7 @@ namespace VideoGameQuotes.Web.Controllers { return Json(this.CreateJsonResponse()); } - [ChildActionOnly] + [PrivateAction] public ActionResult MainMenu() { var model = new MainMenuModel { User = userProvider.CurrentUser }; return PartialView("MainMenu", model); diff --git a/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs b/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs index ed12483..b1ffd9d 100644 --- a/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs +++ b/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs @@ -6,6 +6,7 @@ using Portoa.Persistence; using Portoa.Search; using Portoa.Validation.DataAnnotations; using Portoa.Web.Controllers; +using Portoa.Web.Filters; using Portoa.Web.Models; using Portoa.Web.Results; using Portoa.Web.Security; @@ -135,7 +136,7 @@ namespace VideoGameQuotes.Web.Controllers { return RedirectToAction("Quote", new { id = quote.Id, text = quote.GetUrlFriendlyText() }); } - [ChildActionOnly] + [PrivateAction] public ActionResult QuoteOfTheDay() { var today = DateTime.UtcNow.DayOfYear; var quote = quoteService.GetQuoteForDayOfYear(today); diff --git a/VideoGameQuotes.sln b/VideoGameQuotes.sln index f27059e..5645ba0 100644 --- a/VideoGameQuotes.sln +++ b/VideoGameQuotes.sln @@ -13,6 +13,47 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{C8E910E1-B84 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{236929F9-AE7D-4C78-A3D9-E0ED2EA84609}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{4C702D70-7D2E-410D-A3C6-50598863E102}" + ProjectSection(SolutionItems) = preProject + Lib\Antlr3.Runtime.dll = Lib\Antlr3.Runtime.dll + Lib\Iesi.Collections.dll = Lib\Iesi.Collections.dll + Lib\Iesi.Collections.xml = Lib\Iesi.Collections.xml + Lib\LinFu.DynamicProxy.dll = Lib\LinFu.DynamicProxy.dll + Lib\log4net.dll = Lib\log4net.dll + Lib\log4net.xml = Lib\log4net.xml + Lib\Lucene.Net.dll = Lib\Lucene.Net.dll + Lib\Lucene.Net.xml = Lib\Lucene.Net.xml + Lib\Microsoft.Practices.Unity.Configuration.dll = Lib\Microsoft.Practices.Unity.Configuration.dll + Lib\Microsoft.Practices.Unity.Configuration.xml = Lib\Microsoft.Practices.Unity.Configuration.xml + Lib\Microsoft.Practices.Unity.dll = Lib\Microsoft.Practices.Unity.dll + Lib\Microsoft.Practices.Unity.Interception.Configuration.dll = Lib\Microsoft.Practices.Unity.Interception.Configuration.dll + Lib\Microsoft.Practices.Unity.Interception.Configuration.xml = Lib\Microsoft.Practices.Unity.Interception.Configuration.xml + Lib\Microsoft.Practices.Unity.Interception.dll = Lib\Microsoft.Practices.Unity.Interception.dll + Lib\Microsoft.Practices.Unity.Interception.xml = Lib\Microsoft.Practices.Unity.Interception.xml + Lib\Microsoft.Practices.Unity.xml = Lib\Microsoft.Practices.Unity.xml + Lib\Moq.dll = Lib\Moq.dll + Lib\Moq.xml = Lib\Moq.xml + Lib\MySql.Data.dll = Lib\MySql.Data.dll + Lib\NHibernate.ByteCode.LinFu.dll = Lib\NHibernate.ByteCode.LinFu.dll + Lib\NHibernate.ByteCode.LinFu.xml = Lib\NHibernate.ByteCode.LinFu.xml + Lib\NHibernate.dll = Lib\NHibernate.dll + Lib\NHibernate.xml = Lib\NHibernate.xml + Lib\nunit.framework.dll = Lib\nunit.framework.dll + Lib\nunit.framework.xml = Lib\nunit.framework.xml + Lib\Portoa.dll = Lib\Portoa.dll + Lib\Portoa.Log4Net.dll = Lib\Portoa.Log4Net.dll + Lib\Portoa.Log4Net.xml = Lib\Portoa.Log4Net.xml + Lib\Portoa.Lucene.dll = Lib\Portoa.Lucene.dll + Lib\Portoa.Lucene.xml = Lib\Portoa.Lucene.xml + Lib\Portoa.NHibernate.dll = Lib\Portoa.NHibernate.dll + Lib\Portoa.NHibernate.xml = Lib\Portoa.NHibernate.xml + Lib\Portoa.Web.dll = Lib\Portoa.Web.dll + Lib\Portoa.Web.xml = Lib\Portoa.Web.xml + Lib\Portoa.xml = Lib\Portoa.xml + Lib\Remotion.Data.Linq.dll = Lib\Remotion.Data.Linq.dll + Lib\UnityGenerics.dll = Lib\UnityGenerics.dll + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU