Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Final Review with Derick Bailey for Knockout Production

  • Loading branch information...
commit 65da5f16659338ec0e0f29fdd816592dd42c512e 1 parent 040dbdb
@subsonic subsonic authored
Showing with 17,084 additions and 0 deletions.
  1. +20 −0 MvcMusicStore.sln
  2. BIN  MvcMusicStore.suo
  3. BIN  MvcMusicStore.v11.suo
  4. +4 −0 MvcMusicStore/App_Code/Assets.cshtml
  5. +92 −0 MvcMusicStore/App_Code/Forms.cshtml
  6. +19 −0 MvcMusicStore/App_Code/Notifier.cshtml
  7. +27 −0 MvcMusicStore/App_Code/OrderHelper.cshtml
  8. BIN  MvcMusicStore/App_Data/ASPNETDB.MDF
  9. BIN  MvcMusicStore/App_Data/aspnetdb_log.ldf
  10. +83 −0 MvcMusicStore/CodeTemplates/AddController/Controller.tt
  11. +206 −0 MvcMusicStore/CodeTemplates/AddView/CSHTML/Create.tt
  12. +205 −0 MvcMusicStore/CodeTemplates/AddView/CSHTML/Details.tt
  13. +224 −0 MvcMusicStore/CodeTemplates/AddView/CSHTML/Edit.tt
  14. +248 −0 MvcMusicStore/CodeTemplates/AddView/CSHTML/List.tt
  15. +1 −0  MvcMusicStore/Global.asax
  16. +41 −0 MvcMusicStore/Global.asax.cs
  17. +263 −0 MvcMusicStore/MvcMusicStore.csproj
  18. +28 −0 MvcMusicStore/MvcMusicStore.csproj.user
  19. +35 −0 MvcMusicStore/Properties/AssemblyInfo.cs
  20. +30 −0 MvcMusicStore/Web.Debug.config
  21. +31 −0 MvcMusicStore/Web.Release.config
  22. +4 −0 MvcMusicStore/assets/css/bootstrap-responsive.min.css
  23. +632 −0 MvcMusicStore/assets/css/bootstrap.min.css
  24. +71 −0 MvcMusicStore/assets/css/overrides.css
  25. BIN  MvcMusicStore/assets/images/album_art/1.jpg
  26. BIN  MvcMusicStore/assets/images/album_art/10.jpg
  27. BIN  MvcMusicStore/assets/images/album_art/100.jpg
  28. BIN  MvcMusicStore/assets/images/album_art/101.jpg
  29. BIN  MvcMusicStore/assets/images/album_art/102.jpg
  30. BIN  MvcMusicStore/assets/images/album_art/103.jpg
  31. BIN  MvcMusicStore/assets/images/album_art/104.jpg
  32. BIN  MvcMusicStore/assets/images/album_art/105.jpg
  33. BIN  MvcMusicStore/assets/images/album_art/106.jpg
  34. BIN  MvcMusicStore/assets/images/album_art/107.jpg
  35. BIN  MvcMusicStore/assets/images/album_art/108.jpg
  36. BIN  MvcMusicStore/assets/images/album_art/109.jpg
  37. BIN  MvcMusicStore/assets/images/album_art/11.jpg
  38. BIN  MvcMusicStore/assets/images/album_art/110.jpg
  39. BIN  MvcMusicStore/assets/images/album_art/111.jpg
  40. BIN  MvcMusicStore/assets/images/album_art/112.jpg
  41. BIN  MvcMusicStore/assets/images/album_art/113.jpg
  42. BIN  MvcMusicStore/assets/images/album_art/114.jpg
  43. BIN  MvcMusicStore/assets/images/album_art/115.jpg
  44. BIN  MvcMusicStore/assets/images/album_art/116.jpg
  45. BIN  MvcMusicStore/assets/images/album_art/117.jpg
  46. BIN  MvcMusicStore/assets/images/album_art/118.jpg
  47. BIN  MvcMusicStore/assets/images/album_art/119.jpg
  48. BIN  MvcMusicStore/assets/images/album_art/12.jpg
  49. BIN  MvcMusicStore/assets/images/album_art/120.jpg
  50. BIN  MvcMusicStore/assets/images/album_art/121.jpg
  51. BIN  MvcMusicStore/assets/images/album_art/122.jpg
  52. BIN  MvcMusicStore/assets/images/album_art/123.jpg
  53. BIN  MvcMusicStore/assets/images/album_art/124.jpg
  54. BIN  MvcMusicStore/assets/images/album_art/125.jpg
  55. BIN  MvcMusicStore/assets/images/album_art/126.jpg
  56. BIN  MvcMusicStore/assets/images/album_art/127.jpg
  57. BIN  MvcMusicStore/assets/images/album_art/128.jpg
  58. BIN  MvcMusicStore/assets/images/album_art/129.jpg
  59. BIN  MvcMusicStore/assets/images/album_art/13.jpg
  60. BIN  MvcMusicStore/assets/images/album_art/130.jpg
  61. BIN  MvcMusicStore/assets/images/album_art/131.jpg
  62. BIN  MvcMusicStore/assets/images/album_art/132.jpg
  63. BIN  MvcMusicStore/assets/images/album_art/133.jpg
  64. BIN  MvcMusicStore/assets/images/album_art/134.jpg
  65. BIN  MvcMusicStore/assets/images/album_art/135.jpg
  66. BIN  MvcMusicStore/assets/images/album_art/136.jpg
  67. BIN  MvcMusicStore/assets/images/album_art/137.jpg
  68. BIN  MvcMusicStore/assets/images/album_art/138.jpg
  69. BIN  MvcMusicStore/assets/images/album_art/139.jpg
  70. BIN  MvcMusicStore/assets/images/album_art/14.jpg
  71. BIN  MvcMusicStore/assets/images/album_art/140.jpg
  72. BIN  MvcMusicStore/assets/images/album_art/141.jpg
  73. BIN  MvcMusicStore/assets/images/album_art/142.jpg
  74. BIN  MvcMusicStore/assets/images/album_art/143.jpg
  75. BIN  MvcMusicStore/assets/images/album_art/144.jpg
  76. BIN  MvcMusicStore/assets/images/album_art/145.jpg
  77. BIN  MvcMusicStore/assets/images/album_art/146.jpg
  78. BIN  MvcMusicStore/assets/images/album_art/147.jpg
  79. BIN  MvcMusicStore/assets/images/album_art/149.jpg
  80. BIN  MvcMusicStore/assets/images/album_art/15.jpg
  81. BIN  MvcMusicStore/assets/images/album_art/152.jpg
  82. BIN  MvcMusicStore/assets/images/album_art/153.jpg
  83. BIN  MvcMusicStore/assets/images/album_art/154.jpg
  84. BIN  MvcMusicStore/assets/images/album_art/155.jpg
  85. BIN  MvcMusicStore/assets/images/album_art/156.jpg
  86. BIN  MvcMusicStore/assets/images/album_art/157.jpg
  87. BIN  MvcMusicStore/assets/images/album_art/158.jpg
  88. BIN  MvcMusicStore/assets/images/album_art/159.jpg
  89. BIN  MvcMusicStore/assets/images/album_art/16.jpg
  90. BIN  MvcMusicStore/assets/images/album_art/160.jpg
  91. BIN  MvcMusicStore/assets/images/album_art/161.jpg
  92. BIN  MvcMusicStore/assets/images/album_art/162.jpg
  93. BIN  MvcMusicStore/assets/images/album_art/163.jpg
  94. BIN  MvcMusicStore/assets/images/album_art/164.jpg
  95. BIN  MvcMusicStore/assets/images/album_art/168.jpg
  96. BIN  MvcMusicStore/assets/images/album_art/169.jpg
  97. BIN  MvcMusicStore/assets/images/album_art/170.jpg
  98. BIN  MvcMusicStore/assets/images/album_art/171.gif
  99. BIN  MvcMusicStore/assets/images/album_art/175.jpg
  100. BIN  MvcMusicStore/assets/images/album_art/176.jpg
  101. BIN  MvcMusicStore/assets/images/album_art/177.jpg
  102. BIN  MvcMusicStore/assets/images/album_art/178.gif
  103. BIN  MvcMusicStore/assets/images/album_art/179.jpg
  104. BIN  MvcMusicStore/assets/images/album_art/18.jpg
  105. BIN  MvcMusicStore/assets/images/album_art/182.jpg
  106. BIN  MvcMusicStore/assets/images/album_art/183.jpg
  107. BIN  MvcMusicStore/assets/images/album_art/184.jpg
  108. BIN  MvcMusicStore/assets/images/album_art/185.jpg
  109. BIN  MvcMusicStore/assets/images/album_art/186.jpg
  110. BIN  MvcMusicStore/assets/images/album_art/187.jpg
  111. BIN  MvcMusicStore/assets/images/album_art/188.jpg
  112. BIN  MvcMusicStore/assets/images/album_art/189.jpg
  113. BIN  MvcMusicStore/assets/images/album_art/19.jpg
  114. BIN  MvcMusicStore/assets/images/album_art/190.jpg
  115. BIN  MvcMusicStore/assets/images/album_art/191.jpg
  116. BIN  MvcMusicStore/assets/images/album_art/194.jpg
  117. BIN  MvcMusicStore/assets/images/album_art/196.jpg
  118. BIN  MvcMusicStore/assets/images/album_art/197.jpg
  119. BIN  MvcMusicStore/assets/images/album_art/198.jpg
  120. BIN  MvcMusicStore/assets/images/album_art/199.jpg
  121. BIN  MvcMusicStore/assets/images/album_art/2.jpg
  122. BIN  MvcMusicStore/assets/images/album_art/20.jpg
  123. BIN  MvcMusicStore/assets/images/album_art/200.jpg
  124. BIN  MvcMusicStore/assets/images/album_art/201.jpg
  125. BIN  MvcMusicStore/assets/images/album_art/202.jpg
  126. BIN  MvcMusicStore/assets/images/album_art/203.jpg
  127. BIN  MvcMusicStore/assets/images/album_art/204.jpg
  128. BIN  MvcMusicStore/assets/images/album_art/205.jpg
  129. BIN  MvcMusicStore/assets/images/album_art/206.jpg
  130. BIN  MvcMusicStore/assets/images/album_art/207.jpg
  131. BIN  MvcMusicStore/assets/images/album_art/208.jpg
  132. BIN  MvcMusicStore/assets/images/album_art/209.jpg
  133. BIN  MvcMusicStore/assets/images/album_art/21.jpg
  134. BIN  MvcMusicStore/assets/images/album_art/210.jpg
  135. BIN  MvcMusicStore/assets/images/album_art/211.jpg
  136. BIN  MvcMusicStore/assets/images/album_art/212.jpg
  137. BIN  MvcMusicStore/assets/images/album_art/213.jpg
  138. BIN  MvcMusicStore/assets/images/album_art/214.jpg
  139. BIN  MvcMusicStore/assets/images/album_art/215.jpg
  140. BIN  MvcMusicStore/assets/images/album_art/216.jpg
  141. BIN  MvcMusicStore/assets/images/album_art/217.jpg
  142. BIN  MvcMusicStore/assets/images/album_art/218.jpg
  143. BIN  MvcMusicStore/assets/images/album_art/219.jpg
  144. BIN  MvcMusicStore/assets/images/album_art/22.jpg
  145. BIN  MvcMusicStore/assets/images/album_art/220.jpg
  146. BIN  MvcMusicStore/assets/images/album_art/221.jpg
  147. BIN  MvcMusicStore/assets/images/album_art/222.jpg
  148. BIN  MvcMusicStore/assets/images/album_art/223.jpg
  149. BIN  MvcMusicStore/assets/images/album_art/224.jpg
  150. BIN  MvcMusicStore/assets/images/album_art/225.jpg
  151. BIN  MvcMusicStore/assets/images/album_art/226.jpg
  152. BIN  MvcMusicStore/assets/images/album_art/227.jpg
  153. BIN  MvcMusicStore/assets/images/album_art/228.jpg
  154. BIN  MvcMusicStore/assets/images/album_art/229.jpg
  155. BIN  MvcMusicStore/assets/images/album_art/23.jpg
  156. BIN  MvcMusicStore/assets/images/album_art/230.jpg
  157. BIN  MvcMusicStore/assets/images/album_art/231.jpg
  158. BIN  MvcMusicStore/assets/images/album_art/232.jpg
  159. BIN  MvcMusicStore/assets/images/album_art/233.jpg
  160. BIN  MvcMusicStore/assets/images/album_art/235.jpg
  161. BIN  MvcMusicStore/assets/images/album_art/236.jpg
  162. BIN  MvcMusicStore/assets/images/album_art/237.jpg
  163. BIN  MvcMusicStore/assets/images/album_art/238.jpg
  164. BIN  MvcMusicStore/assets/images/album_art/239.jpg
  165. BIN  MvcMusicStore/assets/images/album_art/24.jpg
  166. BIN  MvcMusicStore/assets/images/album_art/240.gif
  167. BIN  MvcMusicStore/assets/images/album_art/241.jpg
  168. BIN  MvcMusicStore/assets/images/album_art/242.jpg
  169. BIN  MvcMusicStore/assets/images/album_art/243.jpg
  170. BIN  MvcMusicStore/assets/images/album_art/244.jpg
  171. BIN  MvcMusicStore/assets/images/album_art/245.jpg
  172. BIN  MvcMusicStore/assets/images/album_art/246.jpg
  173. BIN  MvcMusicStore/assets/images/album_art/25.jpg
  174. BIN  MvcMusicStore/assets/images/album_art/26.jpg
  175. BIN  MvcMusicStore/assets/images/album_art/27.jpg
  176. BIN  MvcMusicStore/assets/images/album_art/28.jpg
  177. BIN  MvcMusicStore/assets/images/album_art/29.jpg
  178. BIN  MvcMusicStore/assets/images/album_art/3.jpg
  179. BIN  MvcMusicStore/assets/images/album_art/30.jpg
  180. BIN  MvcMusicStore/assets/images/album_art/31.jpg
  181. BIN  MvcMusicStore/assets/images/album_art/32.jpg
  182. BIN  MvcMusicStore/assets/images/album_art/33.jpg
  183. BIN  MvcMusicStore/assets/images/album_art/34.jpg
  184. BIN  MvcMusicStore/assets/images/album_art/35.gif
  185. BIN  MvcMusicStore/assets/images/album_art/36.jpg
  186. BIN  MvcMusicStore/assets/images/album_art/37.jpg
  187. BIN  MvcMusicStore/assets/images/album_art/38.jpg
  188. BIN  MvcMusicStore/assets/images/album_art/39.jpg
  189. BIN  MvcMusicStore/assets/images/album_art/4.jpg
  190. BIN  MvcMusicStore/assets/images/album_art/40.jpg
  191. BIN  MvcMusicStore/assets/images/album_art/41.jpg
  192. BIN  MvcMusicStore/assets/images/album_art/42.jpg
  193. BIN  MvcMusicStore/assets/images/album_art/43.jpg
  194. BIN  MvcMusicStore/assets/images/album_art/44.jpg
  195. BIN  MvcMusicStore/assets/images/album_art/45.jpg
  196. BIN  MvcMusicStore/assets/images/album_art/46.jpg
  197. BIN  MvcMusicStore/assets/images/album_art/47.jpg
  198. BIN  MvcMusicStore/assets/images/album_art/48.jpg
  199. BIN  MvcMusicStore/assets/images/album_art/49.jpg
  200. BIN  MvcMusicStore/assets/images/album_art/4_2.jpg
  201. BIN  MvcMusicStore/assets/images/album_art/5.jpg
  202. BIN  MvcMusicStore/assets/images/album_art/50.jpg
  203. BIN  MvcMusicStore/assets/images/album_art/51.jpg
  204. BIN  MvcMusicStore/assets/images/album_art/52.jpg
  205. BIN  MvcMusicStore/assets/images/album_art/53.jpg
  206. BIN  MvcMusicStore/assets/images/album_art/54.jpg
  207. BIN  MvcMusicStore/assets/images/album_art/55.jpg
  208. BIN  MvcMusicStore/assets/images/album_art/56.jpg
  209. BIN  MvcMusicStore/assets/images/album_art/57.jpg
  210. BIN  MvcMusicStore/assets/images/album_art/58.jpg
  211. BIN  MvcMusicStore/assets/images/album_art/59.jpg
  212. BIN  MvcMusicStore/assets/images/album_art/6.jpg
  213. BIN  MvcMusicStore/assets/images/album_art/60.jpg
  214. BIN  MvcMusicStore/assets/images/album_art/61.jpg
  215. BIN  MvcMusicStore/assets/images/album_art/62.jpg
  216. BIN  MvcMusicStore/assets/images/album_art/63.jpg
  217. BIN  MvcMusicStore/assets/images/album_art/64.jpg
  218. BIN  MvcMusicStore/assets/images/album_art/65.jpg
  219. BIN  MvcMusicStore/assets/images/album_art/66.jpg
  220. BIN  MvcMusicStore/assets/images/album_art/67.jpg
  221. BIN  MvcMusicStore/assets/images/album_art/68.jpg
  222. BIN  MvcMusicStore/assets/images/album_art/69.jpg
  223. BIN  MvcMusicStore/assets/images/album_art/7.jpg
  224. BIN  MvcMusicStore/assets/images/album_art/70.jpg
  225. BIN  MvcMusicStore/assets/images/album_art/71.jpg
  226. BIN  MvcMusicStore/assets/images/album_art/72.jpg
  227. BIN  MvcMusicStore/assets/images/album_art/73.jpg
  228. BIN  MvcMusicStore/assets/images/album_art/74.jpg
  229. BIN  MvcMusicStore/assets/images/album_art/75.jpg
  230. BIN  MvcMusicStore/assets/images/album_art/76.jpg
  231. BIN  MvcMusicStore/assets/images/album_art/77.jpg
  232. BIN  MvcMusicStore/assets/images/album_art/78.jpg
  233. BIN  MvcMusicStore/assets/images/album_art/79.jpg
  234. BIN  MvcMusicStore/assets/images/album_art/8.jpg
  235. BIN  MvcMusicStore/assets/images/album_art/80.jpg
  236. BIN  MvcMusicStore/assets/images/album_art/81.jpg
  237. BIN  MvcMusicStore/assets/images/album_art/82.jpg
  238. BIN  MvcMusicStore/assets/images/album_art/83.jpg
  239. BIN  MvcMusicStore/assets/images/album_art/84.jpg
  240. BIN  MvcMusicStore/assets/images/album_art/85.jpg
  241. BIN  MvcMusicStore/assets/images/album_art/86.jpg
  242. BIN  MvcMusicStore/assets/images/album_art/87.jpg
  243. BIN  MvcMusicStore/assets/images/album_art/88.jpg
  244. BIN  MvcMusicStore/assets/images/album_art/89.jpg
  245. BIN  MvcMusicStore/assets/images/album_art/9.jpg
  246. BIN  MvcMusicStore/assets/images/album_art/90.gif
  247. BIN  MvcMusicStore/assets/images/album_art/91.jpg
  248. BIN  MvcMusicStore/assets/images/album_art/92.jpg
  249. BIN  MvcMusicStore/assets/images/album_art/93.jpg
  250. BIN  MvcMusicStore/assets/images/album_art/94.jpg
  251. BIN  MvcMusicStore/assets/images/album_art/95.jpg
  252. BIN  MvcMusicStore/assets/images/album_art/97.jpg
  253. BIN  MvcMusicStore/assets/images/album_art/98.jpg
  254. BIN  MvcMusicStore/assets/images/album_art/99.jpg
  255. BIN  MvcMusicStore/assets/images/glyphicons-halflings-white.png
  256. BIN  MvcMusicStore/assets/images/glyphicons-halflings.png
  257. BIN  MvcMusicStore/assets/images/home-showcase.gif
  258. BIN  MvcMusicStore/assets/images/home-showcase.jpg
  259. BIN  MvcMusicStore/assets/images/home-showcase.png
  260. BIN  MvcMusicStore/assets/images/logo.png
  261. BIN  MvcMusicStore/assets/images/paid.png
  262. BIN  MvcMusicStore/assets/images/placeholder.gif
  263. +1 −0  MvcMusicStore/assets/js/application.js
  264. +157 −0 MvcMusicStore/assets/js/bootstrap-collapse.js
  265. +1 −0  MvcMusicStore/assets/js/bootstrap.min.js
  266. +69 −0 MvcMusicStore/assets/js/knockout.mapping.js
  267. +10 −0 MvcMusicStore/assets/js/knockout_custom_bindings.js
  268. +28 −0 MvcMusicStore/assets/js/notifier.js
  269. +32 −0 MvcMusicStore/assets/js/order.js
  270. +126 −0 MvcMusicStore/assets/js/order_editor.js
  271. +17 −0 MvcMusicStore/assets/js/utility.js
  272. BIN  MvcMusicStore/bin/EntityFramework.dll
  273. +13,206 −0 MvcMusicStore/bin/EntityFramework.xml
  274. BIN  MvcMusicStore/bin/IronRuby.Libraries.Yaml.dll
  275. BIN  MvcMusicStore/bin/IronRuby.Libraries.dll
  276. BIN  MvcMusicStore/bin/IronRuby.dll
  277. BIN  MvcMusicStore/bin/Jurassic.dll
  278. BIN  MvcMusicStore/bin/Microsoft.Dynamic.dll
  279. BIN  MvcMusicStore/bin/Microsoft.Scripting.Metadata.dll
  280. BIN  MvcMusicStore/bin/Microsoft.Scripting.dll
  281. BIN  MvcMusicStore/bin/Microsoft.Web.Infrastructure.dll
  282. +19 −0 MvcMusicStore/bin/Microsoft.Web.Infrastructure.xml
  283. BIN  MvcMusicStore/bin/MvcMusicStore.dll
  284. BIN  MvcMusicStore/bin/MvcMusicStore.pdb
  285. +208 −0 MvcMusicStore/controllers/AccountController.cs
  286. +110 −0 MvcMusicStore/controllers/AlbumsController.cs
  287. +30 −0 MvcMusicStore/controllers/DbController.cs
  288. +82 −0 MvcMusicStore/controllers/GenresController.cs
  289. +31 −0 MvcMusicStore/controllers/HomeController.cs
  290. +71 −0 MvcMusicStore/controllers/OrderDetailsController.cs
  291. +74 −0 MvcMusicStore/controllers/OrderNotesController.cs
  292. +187 −0 MvcMusicStore/controllers/OrdersController.cs
  293. +89 −0 MvcMusicStore/controllers/ShoppingCartController.cs
  294. +97 −0 MvcMusicStore/controllers/TransactionsController.cs
  295. +35 −0 MvcMusicStore/helpers/Gravatar.cs
  296. +67 −0 MvcMusicStore/models/AccountModels.cs
  297. +37 −0 MvcMusicStore/models/Album.cs
  298. +8 −0 MvcMusicStore/models/Artist.cs
  299. +16 −0 MvcMusicStore/models/Cart.cs
  300. +12 −0 MvcMusicStore/models/Genre.cs
Sorry, we could not display the entire diff because too many files (418) changed.
View
20 MvcMusicStore.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvcMusicStore", "MvcMusicStore\MvcMusicStore.csproj", "{32DCD27D-A84C-4250-B657-408B3620A9AC}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {32DCD27D-A84C-4250-B657-408B3620A9AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {32DCD27D-A84C-4250-B657-408B3620A9AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {32DCD27D-A84C-4250-B657-408B3620A9AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {32DCD27D-A84C-4250-B657-408B3620A9AC}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
View
BIN  MvcMusicStore.suo
Binary file not shown
View
BIN  MvcMusicStore.v11.suo
Binary file not shown
View
4 MvcMusicStore/App_Code/Assets.cshtml
@@ -0,0 +1,4 @@
+@helper AlbumArt(MvcMusicStore.Models.Album album, string size = "260"){
+ //your CDN url goes here
+ <img src="/assets/images/album_art/@album.AlbumArtUrl" alt="@album.Title" width="@size"/>
+}
View
92 MvcMusicStore/App_Code/Forms.cshtml
@@ -0,0 +1,92 @@
+@helper ValidationMessage(string name){
+ <span class="field-validation-valid" data-valmsg-for="@name" data-valmsg-replace="true"></span>
+}
+@helper TextBox(string name, object value = null, int? size =null) {
+ var val = value ?? "";
+ var _size = size ?? 20;
+ <p>
+ <label>@name</label>
+ <input type="text" name="@name" id="@name" value="@val" size = '@_size'/>
+ </p>
+}
+@helper TextBoxDate(string name, object value = null) {
+ var val = value ?? "";
+ <p>
+ <label>@name</label>
+ <input type="text" name="@name" id="@name" value="@val" class="datepicker"/>
+ </p>
+}
+@helper TextBoxRequired(string name, object value = null, int? size=null, string requiredMessage = "Required") {
+ var val = value ?? "";
+ var _size = size ?? 20;
+ <p>
+ <label>@name *</label>
+ <input type="text" name="@name" id="@name" value="@val" data-val="true" data-val-required="@requiredMessage" size = '@_size'/>
+ @ValidationMessage(name)
+ </p>
+
+}
+@helper TextBoxNumber(string name, object value = null, string numberMessage = "Should be a number") {
+ var val = value ?? "";
+ <p>
+ <label>@name *</label>
+ <input type="text" name="@name" id="@name" value="@val" data-val="true"
+ data-val-number="@numberMessage" />
+ @ValidationMessage(name)
+ </p>
+
+}
+@helper TextArea(string name, string attributes = "", object value = null) {
+ var val = value ?? "";
+ <p>
+ <label>@name</label>
+ <textarea name="@name" id="@name" @attributes >@val</textarea>
+ </p>
+}
+@helper Submit(string value="Save"){
+ <p>
+ <button type="submit" class="button positive">
+ <img src="/public/stylesheets/plugins/buttons/icons/tick.png" alt=""/>@value
+ </button>
+ </p>
+ <div class="clear"></div>
+}
+@helper HiddenID(object id){
+ <input type="hidden" name="ID" id="ID" value="@id" />
+}
+
+@helper DeleteButton(string actionUrl,int itemId, bool iconOnly=false) {
+ <form class="delForm" action="@actionUrl" method="post" style = "display:inline">
+ <input type="hidden" name="id" value="@itemId" />
+ <button type="submit" class="btn btn-danger">
+ <i class="icon icon-remove icon-white"></i>
+ @if(!iconOnly){
+ <span>Delete</span>
+ }
+ </button>
+ </form>
+}
+
+@helper SubmitLink(string text, string icon = "") {
+ <button type="submit" class="link">
+ <i class="icon @icon"></i>
+ @text
+ </button>
+}
+
+@helper DeleteConfirmScript(){
+ <script type="text/javascript">
+ $().ready(function () {
+ $(".delForm").submit(function () {
+ return confirm("Delete this record? Are you sure?");
+ });
+ });
+ </script>
+}
+
+@helper EditButton(string url){
+ <a href="@url" class="btn btn-info">
+ <i class="icon icon-edit icon-white"></i>
+ Edit
+ </a>
+}
View
19 MvcMusicStore/App_Code/Notifier.cshtml
@@ -0,0 +1,19 @@
+@helper Script(dynamic tempData){
+ <div class="container">
+ <div id="notifier" class="row span8"></div>
+ </div>
+
+ if (tempData["message"] != null) {
+ <script type="text/javascript">
+ notifier.success('@tempData["message"]');
+ </script>
+ }else if (tempData["alert"] != null) {
+ <script type="text/javascript">
+ notifier.error('@tempData["alert"]');
+ </script>
+ }else if (tempData["notice"] != null) {
+ <script type="text/javascript">
+ notifier.warn('@tempData["notice"]');
+ </script>
+ }
+}
View
27 MvcMusicStore/App_Code/OrderHelper.cshtml
@@ -0,0 +1,27 @@
+@helper LinksForStatus(MvcMusicStore.Models.Order order){
+ if(order.Status == "paid"){
+ <form id="statusForm" action="/orders/refund" method="post" style="display:inline">
+ <input type="hidden" name="id" value="@order.OrderId" />
+ <li>@Forms.SubmitLink("Refund", "icon-repeat")</li>
+ </form>
+ <form id="statusForm" action="/orders/ship" method="post" style="display:inline">
+ <input type="hidden" name="id" value="@order.OrderId" />
+ <li>@Forms.SubmitLink("Set As Shipped", "icon-plane")</li>
+ </form>
+ }
+ else if (order.Status == "refunded")
+ {
+ <form id="statusForm" action="/orders/void" method="post" style="display:inline">
+ <input type="hidden" name="id" value="@order.OrderId" />
+ <li>@Forms.SubmitLink("Void", "icon-ban-circle")</li>
+ </form>
+ }
+ else if (order.Status == "shipped")
+ {
+ <form id="statusForm" action="/orders/refund" method="post" style="display:inline">
+ <input type="hidden" name="id" value="@order.OrderId" />
+ <li>@Forms.SubmitLink("Refund", "icon-repeat")</li>
+ </form>
+ }
+
+}
View
BIN  MvcMusicStore/App_Data/ASPNETDB.MDF
Binary file not shown
View
BIN  MvcMusicStore/App_Data/aspnetdb_log.ldf
Binary file not shown
View
83 MvcMusicStore/CodeTemplates/AddController/Controller.tt
@@ -0,0 +1,83 @@
+<#@ template language="C#" HostSpecific="True" #>
+<#
+MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)(Host);
+
+string EntitySet = mvcHost.ControllerName.Replace("Controller","");
+string ModelName = EntitySet.TrimEnd(new char[]{'s'});
+#>
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.Mvc;
+using System.Data;
+using System.Data.Entity;
+using MvcMusicStore.Models;
+
+namespace <#= mvcHost.Namespace #>
+{
+ public class <#= mvcHost.ControllerName #> : DbController
+ {
+
+ public ActionResult Index()
+ {
+ return View(db.<#=EntitySet#>.ToList());
+ }
+
+<#
+if(mvcHost.AddActionMethods) {
+#>
+
+ public ActionResult Details(int id)
+ {
+ return View(db.<#=EntitySet#>.Find(id));
+ }
+
+ public ActionResult Create()
+ {
+ return View();
+ }
+
+ [HttpPost]
+ public ActionResult Create(<#=ModelName#> item)
+ {
+ if (ModelState.IsValid)
+ {
+ db.<#=EntitySet#>.Add(item);
+ return RedirectToAction("Index");
+ }
+ else
+ {
+ return View();
+ }
+ }
+
+ public ActionResult Edit(int id)
+ {
+ return View(db.<#=EntitySet#>.Find(id));
+ }
+
+
+ [HttpPost]
+ public ActionResult Edit(<#=ModelName#> item)
+ {
+ if (ModelState.IsValid)
+ {
+ db.Entry(item).State = EntityState.Modified;
+ }
+
+ return View(item);
+ }
+
+ [HttpPost]
+ public ActionResult Delete(int id)
+ {
+ var item = db.<#=EntitySet#>.Find(id);
+ db.<#=EntitySet#>.Remove(item);
+ return RedirectToAction("Index");
+ }
+<#
+}
+#>
+ }
+}
View
206 MvcMusicStore/CodeTemplates/AddView/CSHTML/Create.tt
@@ -0,0 +1,206 @@
+<#@ template language="C#" HostSpecific="True" #>
+<#@ output extension=".cshtml" #>
+<#@ assembly name="System.ComponentModel.DataAnnotations" #>
+<#@ assembly name="System.Core" #>
+<#@ assembly name="System.Data.Entity" #>
+<#@ assembly name="System.Data.Linq" #>
+<#@ import namespace="System" #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.ComponentModel.DataAnnotations" #>
+<#@ import namespace="System.Data.Linq.Mapping" #>
+<#@ import namespace="System.Data.Objects.DataClasses" #>
+<#@ import namespace="System.Linq" #>
+<#@ import namespace="System.Reflection" #>
+<#
+MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)(Host);
+#>
+@model <#= mvcHost.ViewDataTypeName #>
+<#
+// The following chained if-statement outputs the file header code and markup for a partial view, a content page, or a regular view.
+if(mvcHost.IsPartialView) {
+#>
+
+<#
+} else if(mvcHost.IsContentPage) {
+#>
+
+@{
+ ViewBag.Title = "<#= mvcHost.ViewName#>";
+<#
+if (!String.IsNullOrEmpty(mvcHost.MasterPageFile)) {
+#>
+ Layout = "<#= mvcHost.MasterPageFile#>";
+<#
+}
+#>
+}
+
+<div class = "container">
+ <div class = "row span12">
+ <h2><#= mvcHost.ViewName#></h2>
+
+ <#
+ } else {
+ #>
+
+ @{
+ Layout = null;
+ }
+
+ <!DOCTYPE html>
+
+ <html>
+ <head>
+ <title><#= mvcHost.ViewName #></title>
+ </head>
+ <body>
+ <#
+ PushIndent(" ");
+ }
+ #>
+ <#
+ if (mvcHost.ReferenceScriptLibraries) {
+ #>
+ <#
+ if (!mvcHost.IsContentPage) {
+ #>
+ <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
+ <#
+ }
+ #>
+ <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+ <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+ <#
+ }
+ #>
+ @using (Html.BeginForm()) {
+ @Html.ValidationSummary(true)
+ <fieldset>
+ <legend><#= mvcHost.ViewDataType.Name #></legend>
+
+ <#
+ foreach (ModelProperty property in GetModelProperties(mvcHost.ViewDataType)) {
+ if (!property.IsPrimaryKey && !property.IsReadOnly) {
+ #>
+ @Forms.TextBox("<#= property.Name #>",@Model.<#= property.Name #>)
+ <#
+ }
+ }
+ #>
+ <p>
+ <input class="btn btn-primary" type="submit" value="Save" />
+ </p>
+ </fieldset>
+ }
+
+ <div>
+ @Html.ActionLink("Back to List", "Index")
+ </div>
+ </div>
+</div>
+
+<#+
+// Describes the information about a property on the model
+class ModelProperty {
+ public string Name { get; set; }
+ public string ValueExpression { get; set; }
+ public Type UnderlyingType { get; set; }
+ public bool IsPrimaryKey { get; set; }
+ public bool IsReadOnly { get; set; }
+}
+
+// Change this list to include any non-primitive types you think should be eligible for display/edit
+static Type[] bindableNonPrimitiveTypes = new[] {
+ typeof(string),
+ typeof(decimal),
+ typeof(Guid),
+ typeof(DateTime),
+ typeof(DateTimeOffset),
+ typeof(TimeSpan),
+};
+
+// Call this to get the list of properties in the model. Change this to modify or add your
+// own default formatting for display values.
+List<ModelProperty> GetModelProperties(Type type) {
+ List<ModelProperty> results = GetEligibleProperties(type);
+
+ foreach (ModelProperty prop in results) {
+ if (prop.UnderlyingType == typeof(double) || prop.UnderlyingType == typeof(decimal)) {
+ prop.ValueExpression = "String.Format(\"{0:F}\", " + prop.ValueExpression + ")";
+ }
+ else if (prop.UnderlyingType == typeof(DateTime)) {
+ prop.ValueExpression = "String.Format(\"{0:g}\", " + prop.ValueExpression + ")";
+ }
+ }
+
+ return results;
+}
+
+// Call this to determine if the property represents a primary key. Change the
+// code to change the definition of primary key.
+bool IsPrimaryKey(PropertyInfo property) {
+ if (string.Equals(property.Name, "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ if (string.Equals(property.Name, property.DeclaringType.Name + "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ foreach (object attribute in property.GetCustomAttributes(true)) {
+ if (attribute is KeyAttribute) { // WCF RIA Services and EF Code First explicit
+ return true;
+ }
+
+ var edmScalar = attribute as EdmScalarPropertyAttribute;
+ if (edmScalar != null && edmScalar.EntityKeyProperty) { // EF traditional
+ return true;
+ }
+
+ var column = attribute as ColumnAttribute;
+ if (column != null && column.IsPrimaryKey) { // LINQ to SQL
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// This will return the primary key property name, if and only if there is exactly
+// one primary key. Returns null if there is no PK, or the PK is composite.
+string GetPrimaryKeyName(Type type) {
+ IEnumerable<string> pkNames = GetPrimaryKeyNames(type);
+ return pkNames.Count() == 1 ? pkNames.First() : null;
+}
+
+// This will return all the primary key names. Will return an empty list if there are none.
+IEnumerable<string> GetPrimaryKeyNames(Type type) {
+ return GetEligibleProperties(type).Where(mp => mp.IsPrimaryKey).Select(mp => mp.Name);
+}
+
+// Helper
+List<ModelProperty> GetEligibleProperties(Type type) {
+ List<ModelProperty> results = new List<ModelProperty>();
+
+ foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
+ Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
+ if (prop.GetGetMethod() != null && prop.GetIndexParameters().Length == 0 && IsBindableType(underlyingType)) {
+ results.Add(new ModelProperty {
+ Name = prop.Name,
+ ValueExpression = "Model." + prop.Name,
+ UnderlyingType = underlyingType,
+ IsPrimaryKey = IsPrimaryKey(prop),
+ IsReadOnly = prop.GetSetMethod() == null
+ });
+ }
+ }
+
+ return results;
+}
+
+// Helper
+bool IsBindableType(Type type) {
+ return type.IsPrimitive || bindableNonPrimitiveTypes.Contains(type);
+}
+#>
View
205 MvcMusicStore/CodeTemplates/AddView/CSHTML/Details.tt
@@ -0,0 +1,205 @@
+<#@ template language="C#" HostSpecific="True" #>
+<#@ output extension=".cshtml" #>
+<#@ assembly name="System.ComponentModel.DataAnnotations" #>
+<#@ assembly name="System.Core" #>
+<#@ assembly name="System.Data.Entity" #>
+<#@ assembly name="System.Data.Linq" #>
+<#@ import namespace="System" #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.ComponentModel.DataAnnotations" #>
+<#@ import namespace="System.Data.Linq.Mapping" #>
+<#@ import namespace="System.Data.Objects.DataClasses" #>
+<#@ import namespace="System.Linq" #>
+<#@ import namespace="System.Reflection" #>
+<#
+MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)(Host);
+#>
+@model <#= mvcHost.ViewDataTypeName #>
+<#
+// The following chained if-statement outputs the file header code and markup for a partial view, a content page, or a regular view.
+if(mvcHost.IsPartialView) {
+#>
+
+<#
+} else if(mvcHost.IsContentPage) {
+#>
+
+@{
+ ViewBag.Title = "<#= mvcHost.ViewName#>";
+<#
+if (!String.IsNullOrEmpty(mvcHost.MasterPageFile)) {
+#>
+ Layout = "<#= mvcHost.MasterPageFile#>";
+<#
+}
+#>
+}
+<div class = "container">
+ <div class = "row span12">
+ <h2><#= mvcHost.ViewName#></h2>
+
+ <#
+ } else {
+ #>
+
+ @{
+ Layout = null;
+ }
+
+ <!DOCTYPE html>
+
+ <html>
+ <head>
+ <title><#= mvcHost.ViewName #></title>
+ </head>
+ <body>
+ <#
+ PushIndent(" ");
+ }
+ #>
+ <fieldset>
+ <legend><#= mvcHost.ViewDataType.Name #></legend>
+ <#
+ foreach (ModelProperty property in GetModelProperties(mvcHost.ViewDataType)) {
+ if (!property.IsPrimaryKey) {
+ #>
+
+ <div class="display-label"><#= property.Name #></div>
+ <div class="display-field">@<#= property.ValueExpression #></div>
+ <#
+ }
+ }
+ #>
+ </fieldset>
+ <p>
+ <#
+ string pkName = GetPrimaryKeyName(mvcHost.ViewDataType);
+ if (pkName != null) {
+ #>
+ @Html.ActionLink("Edit", "Edit", new { id=Model.<#= pkName #> }) |
+ @Html.ActionLink("Back to List", "Index")
+ <#
+ } else {
+ #>
+ @Html.ActionLink("Edit", "Edit", new { /* id=Model.PrimaryKey */ }) |
+ @Html.ActionLink("Back to List", "Index")
+ <#
+ }
+ #>
+ </p>
+ </div>
+</div>
+<#
+if(!mvcHost.IsPartialView && !mvcHost.IsContentPage) {
+ ClearIndent();
+#>
+</body>
+</html>
+<#
+}
+#>
+
+<#+
+// Describes the information about a property on the model
+class ModelProperty {
+ public string Name { get; set; }
+ public string ValueExpression { get; set; }
+ public Type UnderlyingType { get; set; }
+ public bool IsPrimaryKey { get; set; }
+ public bool IsReadOnly { get; set; }
+}
+
+// Change this list to include any non-primitive types you think should be eligible for display/edit
+static Type[] bindableNonPrimitiveTypes = new[] {
+ typeof(string),
+ typeof(decimal),
+ typeof(Guid),
+ typeof(DateTime),
+ typeof(DateTimeOffset),
+ typeof(TimeSpan),
+};
+
+// Call this to get the list of properties in the model. Change this to modify or add your
+// own default formatting for display values.
+List<ModelProperty> GetModelProperties(Type type) {
+ List<ModelProperty> results = GetEligibleProperties(type);
+
+ foreach (ModelProperty prop in results) {
+ if (prop.UnderlyingType == typeof(double) || prop.UnderlyingType == typeof(decimal)) {
+ prop.ValueExpression = "String.Format(\"{0:F}\", " + prop.ValueExpression + ")";
+ }
+ else if (prop.UnderlyingType == typeof(DateTime)) {
+ prop.ValueExpression = "String.Format(\"{0:g}\", " + prop.ValueExpression + ")";
+ }
+ }
+
+ return results;
+}
+
+// Call this to determine if the property represents a primary key. Change the
+// code to change the definition of primary key.
+bool IsPrimaryKey(PropertyInfo property) {
+ if (string.Equals(property.Name, "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ if (string.Equals(property.Name, property.DeclaringType.Name + "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ foreach (object attribute in property.GetCustomAttributes(true)) {
+ if (attribute is KeyAttribute) { // WCF RIA Services and EF Code First explicit
+ return true;
+ }
+
+ var edmScalar = attribute as EdmScalarPropertyAttribute;
+ if (edmScalar != null && edmScalar.EntityKeyProperty) { // EF traditional
+ return true;
+ }
+
+ var column = attribute as ColumnAttribute;
+ if (column != null && column.IsPrimaryKey) { // LINQ to SQL
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// This will return the primary key property name, if and only if there is exactly
+// one primary key. Returns null if there is no PK, or the PK is composite.
+string GetPrimaryKeyName(Type type) {
+ IEnumerable<string> pkNames = GetPrimaryKeyNames(type);
+ return pkNames.Count() == 1 ? pkNames.First() : null;
+}
+
+// This will return all the primary key names. Will return an empty list if there are none.
+IEnumerable<string> GetPrimaryKeyNames(Type type) {
+ return GetEligibleProperties(type).Where(mp => mp.IsPrimaryKey).Select(mp => mp.Name);
+}
+
+// Helper
+List<ModelProperty> GetEligibleProperties(Type type) {
+ List<ModelProperty> results = new List<ModelProperty>();
+
+ foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
+ Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
+ if (prop.GetGetMethod() != null && prop.GetIndexParameters().Length == 0 && IsBindableType(underlyingType)) {
+ results.Add(new ModelProperty {
+ Name = prop.Name,
+ ValueExpression = "Model." + prop.Name,
+ UnderlyingType = underlyingType,
+ IsPrimaryKey = IsPrimaryKey(prop),
+ IsReadOnly = prop.GetSetMethod() == null
+ });
+ }
+ }
+
+ return results;
+}
+
+// Helper
+bool IsBindableType(Type type) {
+ return type.IsPrimitive || bindableNonPrimitiveTypes.Contains(type);
+}
+#>
View
224 MvcMusicStore/CodeTemplates/AddView/CSHTML/Edit.tt
@@ -0,0 +1,224 @@
+<#@ template language="C#" HostSpecific="True" #>
+<#@ output extension=".cshtml" #>
+<#@ assembly name="System.ComponentModel.DataAnnotations" #>
+<#@ assembly name="System.Core" #>
+<#@ assembly name="System.Data.Entity" #>
+<#@ assembly name="System.Data.Linq" #>
+<#@ import namespace="System" #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.ComponentModel.DataAnnotations" #>
+<#@ import namespace="System.Data.Linq.Mapping" #>
+<#@ import namespace="System.Data.Objects.DataClasses" #>
+<#@ import namespace="System.Linq" #>
+<#@ import namespace="System.Reflection" #>
+<#
+MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)(Host);
+#>
+@model <#= mvcHost.ViewDataTypeName #>
+<#
+// The following chained if-statement outputs the file header code and markup for a partial view, a content page, or a regular view.
+if(mvcHost.IsPartialView) {
+#>
+
+<#
+} else if(mvcHost.IsContentPage) {
+#>
+
+@{
+ ViewBag.Title = "<#= mvcHost.ViewName#>";
+<#
+if (!String.IsNullOrEmpty(mvcHost.MasterPageFile)) {
+#>
+ Layout = "<#= mvcHost.MasterPageFile#>";
+<#
+}
+#>
+}
+<div class = "container">
+ <div class = "row span12">
+ <h2><#= mvcHost.ViewName#></h2>
+
+ <#
+ } else {
+ #>
+
+ @{
+ Layout = null;
+ }
+
+ <!DOCTYPE html>
+
+ <html>
+ <head>
+ <title><#= mvcHost.ViewName #></title>
+ </head>
+ <body>
+ <#
+ PushIndent(" ");
+ }
+ #>
+ <#
+ if (mvcHost.ReferenceScriptLibraries) {
+ #>
+ <#
+ if (!mvcHost.IsContentPage) {
+ #>
+ <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
+ <#
+ }
+ #>
+ <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+ <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+ <#
+ }
+ #>
+ @using (Html.BeginForm()) {
+ @Html.ValidationSummary(true)
+ <fieldset>
+ <legend><#= mvcHost.ViewDataType.Name #></legend>
+
+ <#
+ foreach (ModelProperty property in GetModelProperties(mvcHost.ViewDataType)) {
+ if (property.IsPrimaryKey) {
+ #>
+ @Html.HiddenFor(model => model.<#= property.Name #>)
+
+ <#
+ } else if (!property.IsReadOnly) {
+ #>
+ @Forms.TextBox("<#= property.Name #>",@Model.<#= property.Name #>)
+
+ <#
+ }
+ }
+ #>
+ <p>
+ <input class="btn btn-primary" type="submit" value="Save" />
+ </p>
+ </fieldset>
+ }
+
+ <div>
+ @Html.ActionLink("Back to List", "Index")
+ </div>
+
+ </div>
+</div>
+<#
+// The following code closes the asp:Content tag used in the case of a master page and the body and html tags in the case of a regular view page
+#>
+<#
+if(!mvcHost.IsPartialView && !mvcHost.IsContentPage) {
+ ClearIndent();
+#>
+</body>
+</html>
+<#
+}
+#>
+
+<#+
+// Describes the information about a property on the model
+class ModelProperty {
+ public string Name { get; set; }
+ public string ValueExpression { get; set; }
+ public Type UnderlyingType { get; set; }
+ public bool IsPrimaryKey { get; set; }
+ public bool IsReadOnly { get; set; }
+}
+
+// Change this list to include any non-primitive types you think should be eligible for display/edit
+static Type[] bindableNonPrimitiveTypes = new[] {
+ typeof(string),
+ typeof(decimal),
+ typeof(Guid),
+ typeof(DateTime),
+ typeof(DateTimeOffset),
+ typeof(TimeSpan),
+};
+
+// Call this to get the list of properties in the model. Change this to modify or add your
+// own default formatting for display values.
+List<ModelProperty> GetModelProperties(Type type) {
+ List<ModelProperty> results = GetEligibleProperties(type);
+
+ foreach (ModelProperty prop in results) {
+ if (prop.UnderlyingType == typeof(double) || prop.UnderlyingType == typeof(decimal)) {
+ prop.ValueExpression = "String.Format(\"{0:F}\", " + prop.ValueExpression + ")";
+ }
+ else if (prop.UnderlyingType == typeof(DateTime)) {
+ prop.ValueExpression = "String.Format(\"{0:g}\", " + prop.ValueExpression + ")";
+ }
+ }
+
+ return results;
+}
+
+// Call this to determine if the property represents a primary key. Change the
+// code to change the definition of primary key.
+bool IsPrimaryKey(PropertyInfo property) {
+ if (string.Equals(property.Name, "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ if (string.Equals(property.Name, property.DeclaringType.Name + "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ foreach (object attribute in property.GetCustomAttributes(true)) {
+ if (attribute is KeyAttribute) { // WCF RIA Services and EF Code First explicit
+ return true;
+ }
+
+ var edmScalar = attribute as EdmScalarPropertyAttribute;
+ if (edmScalar != null && edmScalar.EntityKeyProperty) { // EF traditional
+ return true;
+ }
+
+ var column = attribute as ColumnAttribute;
+ if (column != null && column.IsPrimaryKey) { // LINQ to SQL
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// This will return the primary key property name, if and only if there is exactly
+// one primary key. Returns null if there is no PK, or the PK is composite.
+string GetPrimaryKeyName(Type type) {
+ IEnumerable<string> pkNames = GetPrimaryKeyNames(type);
+ return pkNames.Count() == 1 ? pkNames.First() : null;
+}
+
+// This will return all the primary key names. Will return an empty list if there are none.
+IEnumerable<string> GetPrimaryKeyNames(Type type) {
+ return GetEligibleProperties(type).Where(mp => mp.IsPrimaryKey).Select(mp => mp.Name);
+}
+
+// Helper
+List<ModelProperty> GetEligibleProperties(Type type) {
+ List<ModelProperty> results = new List<ModelProperty>();
+
+ foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
+ Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
+ if (prop.GetGetMethod() != null && prop.GetIndexParameters().Length == 0 && IsBindableType(underlyingType)) {
+ results.Add(new ModelProperty {
+ Name = prop.Name,
+ ValueExpression = "Model." + prop.Name,
+ UnderlyingType = underlyingType,
+ IsPrimaryKey = IsPrimaryKey(prop),
+ IsReadOnly = prop.GetSetMethod() == null
+ });
+ }
+ }
+
+ return results;
+}
+
+// Helper
+bool IsBindableType(Type type) {
+ return type.IsPrimitive || bindableNonPrimitiveTypes.Contains(type);
+}
+#>
View
248 MvcMusicStore/CodeTemplates/AddView/CSHTML/List.tt
@@ -0,0 +1,248 @@
+<#@ template language="C#" HostSpecific="True" #>
+<#@ output extension=".cshtml" #>
+<#@ assembly name="System.ComponentModel.DataAnnotations" #>
+<#@ assembly name="System.Core" #>
+<#@ assembly name="System.Data.Entity" #>
+<#@ assembly name="System.Data.Linq" #>
+<#@ import namespace="System" #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.ComponentModel.DataAnnotations" #>
+<#@ import namespace="System.Data.Linq.Mapping" #>
+<#@ import namespace="System.Data.Objects.DataClasses" #>
+<#@ import namespace="System.Linq" #>
+<#@ import namespace="System.Reflection" #>
+<#
+MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)(Host);
+#>
+@model IEnumerable<#= "<" + mvcHost.ViewDataTypeName + ">" #>
+<#
+// The following chained if-statement outputs the file header code and markup for a partial view, a content page, or a regular view.
+if(mvcHost.IsPartialView) {
+#>
+
+<#
+} else if(mvcHost.IsContentPage) {
+#>
+
+@{
+ ViewBag.Title = "<#= mvcHost.ViewName#>";
+<#
+if (!String.IsNullOrEmpty(mvcHost.MasterPageFile)) {
+#>
+ Layout = "<#= mvcHost.MasterPageFile#>";
+<#
+}
+#>
+}
+<div class = "container">
+ <div class = "row span12">
+ <h2><#= mvcHost.ViewName#></h2>
+
+ <#
+ } else {
+ #>
+
+ @{
+ Layout = null;
+ }
+
+ <!DOCTYPE html>
+
+ <html>
+ <head>
+ <title><#= mvcHost.ViewName #></title>
+ </head>
+ <body>
+ <#
+ PushIndent(" ");
+ }
+ #>
+ <p>
+ @Html.ActionLink("Create New", "Create")
+ </p>
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+
+ <#
+ List<ModelProperty> properties = GetModelProperties(mvcHost.ViewDataType);
+ foreach (ModelProperty property in properties) {
+ if (!property.IsPrimaryKey) {
+ #>
+ <th>
+ <#= property.Name #>
+ </th>
+ <#
+ }
+ }
+ #>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ @foreach (var item in Model) {
+ <tr>
+ <#
+ foreach (ModelProperty property in properties) {
+ if (!property.IsPrimaryKey) {
+ #>
+ <td>
+ @<#= property.ValueExpression.Replace("Model.", "item.") #>
+ </td>
+ <#
+ }
+ }
+ #>
+
+ <td>
+ <a href="@Url.Action("edit", new { id = item.Id })" class="btn btn-info">
+ <i class="icon icon-edit icon-white"></i>
+ Edit
+ </a>
+ <a href="@Url.Action("details", new { id = item.Id })" class="btn btn-primary">
+ <i class="icon icon-search icon-white"></i>
+ Details
+ </a>
+ <form id="delForm" action="@Url.Action("delete")" method="post" style = "display:inline">
+ @Html.Hidden("id",item.Id)
+ <button type="submit" class="btn btn-danger">
+ <i class="icon icon-remove icon-white"></i>
+ Delete
+ </button>
+ </form>
+ </td>
+ }
+
+ </tr>
+ }
+ </tbody>
+ </table>
+ </div>
+</div>
+<script type="text/javascript">
+ $().ready(function () {
+ $("#delForm").submit(function () {
+ return confirm("Delete this record? Are you sure?");
+ });
+ });
+</script>
+<#
+// The following code closes the asp:Content tag used in the case of a master page and the body and html tags in the case of a regular view page
+#>
+<#
+if(mvcHost.IsContentPage) {
+#>
+<#
+} else if(!mvcHost.IsPartialView && !mvcHost.IsContentPage) {
+ ClearIndent();
+#>
+</body>
+</html>
+<#
+}
+#>
+
+<#+
+// Describes the information about a property on the model
+class ModelProperty {
+ public string Name { get; set; }
+ public string ValueExpression { get; set; }
+ public Type UnderlyingType { get; set; }
+ public bool IsPrimaryKey { get; set; }
+ public bool IsReadOnly { get; set; }
+}
+
+// Change this list to include any non-primitive types you think should be eligible for display/edit
+static Type[] bindableNonPrimitiveTypes = new[] {
+ typeof(string),
+ typeof(decimal),
+ typeof(Guid),
+ typeof(DateTime),
+ typeof(DateTimeOffset),
+ typeof(TimeSpan),
+};
+
+// Call this to get the list of properties in the model. Change this to modify or add your
+// own default formatting for display values.
+List<ModelProperty> GetModelProperties(Type type) {
+ List<ModelProperty> results = GetEligibleProperties(type);
+
+ foreach (ModelProperty prop in results) {
+ if (prop.UnderlyingType == typeof(double) || prop.UnderlyingType == typeof(decimal)) {
+ prop.ValueExpression = "String.Format(\"{0:F}\", " + prop.ValueExpression + ")";
+ }
+ else if (prop.UnderlyingType == typeof(DateTime)) {
+ prop.ValueExpression = "String.Format(\"{0:g}\", " + prop.ValueExpression + ")";
+ }
+ }
+
+ return results;
+}
+
+// Call this to determine if the property represents a primary key. Change the
+// code to change the definition of primary key.
+bool IsPrimaryKey(PropertyInfo property) {
+ if (string.Equals(property.Name, "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ if (string.Equals(property.Name, property.DeclaringType.Name + "id", StringComparison.OrdinalIgnoreCase)) { // EF Code First convention
+ return true;
+ }
+
+ foreach (object attribute in property.GetCustomAttributes(true)) {
+ if (attribute is KeyAttribute) { // WCF RIA Services and EF Code First explicit
+ return true;
+ }
+
+ var edmScalar = attribute as EdmScalarPropertyAttribute;
+ if (edmScalar != null && edmScalar.EntityKeyProperty) { // EF traditional
+ return true;
+ }
+
+ var column = attribute as ColumnAttribute;
+ if (column != null && column.IsPrimaryKey) { // LINQ to SQL
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// This will return the primary key property name, if and only if there is exactly
+// one primary key. Returns null if there is no PK, or the PK is composite.
+string GetPrimaryKeyName(Type type) {
+ IEnumerable<string> pkNames = GetPrimaryKeyNames(type);
+ return pkNames.Count() == 1 ? pkNames.First() : null;
+}
+
+// This will return all the primary key names. Will return an empty list if there are none.
+IEnumerable<string> GetPrimaryKeyNames(Type type) {
+ return GetEligibleProperties(type).Where(mp => mp.IsPrimaryKey).Select(mp => mp.Name);
+}
+
+// Helper
+List<ModelProperty> GetEligibleProperties(Type type) {
+ List<ModelProperty> results = new List<ModelProperty>();
+
+ foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
+ Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
+ if (prop.GetGetMethod() != null && prop.GetIndexParameters().Length == 0 && IsBindableType(underlyingType)) {
+ results.Add(new ModelProperty {
+ Name = prop.Name,
+ ValueExpression = "Model." + prop.Name,
+ UnderlyingType = underlyingType,
+ IsPrimaryKey = IsPrimaryKey(prop),
+ IsReadOnly = prop.GetSetMethod() == null
+ });
+ }
+ }
+
+ return results;
+}
+
+// Helper
+bool IsBindableType(Type type) {
+ return type.IsPrimitive || bindableNonPrimitiveTypes.Contains(type);
+}
+#>
View
1  MvcMusicStore/Global.asax
@@ -0,0 +1 @@
+<%@ Application Codebehind="Global.asax.cs" Inherits="MvcMusicStore.MvcApplication" Language="C#" %>
View
41 MvcMusicStore/Global.asax.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.Mvc;
+using System.Web.Routing;
+
+namespace MvcMusicStore
+{
+ // Note: For instructions on enabling IIS6 or IIS7 classic mode,
+ // visit http://go.microsoft.com/?LinkId=9394801
+
+ public class MvcApplication : System.Web.HttpApplication
+ {
+ public static void RegisterGlobalFilters(GlobalFilterCollection filters)
+ {
+ filters.Add(new HandleErrorAttribute());
+ }
+
+ public static void RegisterRoutes(RouteCollection routes)
+ {
+ routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
+
+ routes.MapRoute(
+ "Default", // Route name
+ "{controller}/{action}/{id}", // URL with parameters
+ new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
+ );
+
+ }
+
+ protected void Application_Start()
+ {
+ System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());
+ AreaRegistration.RegisterAllAreas();
+
+ RegisterGlobalFilters(GlobalFilters.Filters);
+ RegisterRoutes(RouteTable.Routes);
+ }
+ }
+}
View
263 MvcMusicStore/MvcMusicStore.csproj
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>
+ </ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{32DCD27D-A84C-4250-B657-408B3620A9AC}</ProjectGuid>
+ <ProjectTypeGuids>{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>MvcMusicStore</RootNamespace>
+ <AssemblyName>MvcMusicStore</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <MvcBuildViews>false</MvcBuildViews>
+ <UseIISExpress>false</UseIISExpress>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ <OldToolsVersion>4.0</OldToolsVersion>
+ <IISExpressSSLPort />
+ <IISExpressAnonymousAuthentication />
+ <IISExpressWindowsAuthentication />
+ <IISExpressUseClassicPipelineMode />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Data.Entity" />
+ <Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
+ <Reference Include="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
+ <Reference Include="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Web.DynamicData" />
+ <Reference Include="System.Web.Entity" />
+ <Reference Include="System.Web.ApplicationServices" />
+ <Reference Include="System.ComponentModel.DataAnnotations" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Web" />
+ <Reference Include="System.Web.Extensions" />
+ <Reference Include="System.Web.Abstractions" />
+ <Reference Include="System.Web.Routing" />
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Configuration" />
+ <Reference Include="System.Web.Services" />
+ <Reference Include="System.EnterpriseServices" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="controllers\AccountController.cs" />
+ <Compile Include="controllers\AlbumsController.cs" />
+ <Compile Include="controllers\DbController.cs" />
+ <Compile Include="controllers\GenresController.cs" />
+ <Compile Include="controllers\HomeController.cs" />
+ <Compile Include="controllers\OrderDetailsController.cs" />
+ <Compile Include="controllers\OrderNotesController.cs" />
+ <Compile Include="controllers\OrdersController.cs" />
+ <Compile Include="controllers\ShoppingCartController.cs" />
+ <Compile Include="controllers\TransactionsController.cs" />
+ <Compile Include="Global.asax.cs">
+ <DependentUpon>Global.asax</DependentUpon>
+ </Compile>
+ <Compile Include="helpers\Gravatar.cs" />
+ <Compile Include="models\AccountModels.cs" />
+ <Compile Include="models\Album.cs" />
+ <Compile Include="models\Artist.cs" />
+ <Compile Include="models\Cart.cs" />
+ <Compile Include="models\Genre.cs" />
+ <Compile Include="models\MusicStoreEntities.cs" />
+ <Compile Include="models\Order.cs" />
+ <Compile Include="models\OrderDetail.cs" />
+ <Compile Include="models\OrderNote.cs" />
+ <Compile Include="models\SampleData.cs" />
+ <Compile Include="models\ShoppingCart.cs" />
+ <Compile Include="models\Transaction.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="models\ShoppingCartRemoveViewModel.cs" />
+ <Compile Include="models\ShoppingCartViewModel.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="assets\css\bootstrap-responsive.min.css" />
+ <Content Include="assets\css\bootstrap.min.css" />
+ <Content Include="assets\css\overrides.css" />
+ <Content Include="assets\js\application.js" />
+ <Content Include="assets\js\bootstrap-collapse.js" />
+ <Content Include="assets\js\bootstrap.min.js" />
+ <Content Include="assets\images\home-showcase.png" />
+ <Content Include="assets\images\logo.png" />
+ <Content Include="assets\images\placeholder.gif" />
+ <Content Include="assets\js\knockout.mapping.js" />
+ <Content Include="assets\js\knockout_custom_bindings.js" />
+ <Content Include="assets\js\utility.js" />
+ <Content Include="assets\js\order.js" />
+ <Content Include="assets\js\order_editor.js" />
+ <Content Include="Global.asax" />
+ <Content Include="assets\images\glyphicons-halflings-white.png" />
+ <Content Include="assets\images\glyphicons-halflings.png" />
+ <Content Include="Web.config" />
+ <Content Include="Web.Debug.config">
+ <DependentUpon>Web.config</DependentUpon>
+ </Content>
+ <Content Include="Web.Release.config">
+ <DependentUpon>Web.config</DependentUpon>
+ </Content>
+ <Content Include="views\Web.config">
+ <SubType>Designer</SubType>
+ </Content>
+ <Content Include="views\_ViewStart.cshtml" />
+ <Content Include="views\Shared\Error.cshtml" />
+ <Content Include="views\Shared\_Layout.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Genres\Details.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="packages.config" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Home\Index.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Genres\Index.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Albums\Index.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Albums\Details.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Albums\Create.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Albums\Edit.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Albums\Delete.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Account\ChangePassword.cshtml" />
+ <Content Include="views\Account\ChangePasswordSuccess.cshtml" />
+ <Content Include="views\Account\LogOn.cshtml" />
+ <Content Include="views\Account\Register.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\ShoppingCart\Index.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\ShoppingCart\CartSummary.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Genres\GenreMenu.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Orders\Index.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Orders\Details.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Orders\Create.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Orders\Edit.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="views\Orders\Delete.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="App_Code\Forms.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="App_Code\OrderHelper.cshtml" />
+ <Content Include="App_Code\Notifier.cshtml" />
+ <Content Include="assets\js\notifier.js" />
+ <Content Include="App_Code\Assets.cshtml" />
+ <None Include="CodeTemplates\AddController\Controller.tt" />
+ <None Include="CodeTemplates\AddView\CSHTML\Create.tt" />
+ <None Include="CodeTemplates\AddView\CSHTML\Details.tt" />
+ <None Include="CodeTemplates\AddView\CSHTML\Edit.tt" />
+ <None Include="CodeTemplates\AddView\CSHTML\List.tt" />
+ <Content Include="views\Transactions\Index.cshtml" />
+ <Content Include="views\Transactions\Details.cshtml" />
+ <Content Include="views\Transactions\Create.cshtml" />
+ <Content Include="views\Transactions\Edit.cshtml" />
+ <Content Include="views\OrderNotes\Index.cshtml" />
+ <Content Include="views\OrderNotes\Details.cshtml" />
+ <Content Include="views\OrderNotes\Create.cshtml" />
+ <Content Include="views\OrderNotes\Edit.cshtml" />
+ <Content Include="views\OrderDetails\Index.cshtml" />
+ <Content Include="views\OrderDetails\Details.cshtml" />
+ <Content Include="views\OrderDetails\Edit.cshtml" />
+ <Content Include="views\Genres\Create.cshtml" />
+ <Content Include="views\Genres\Edit.cshtml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="App_Data\" />
+ </ItemGroup>
+ <PropertyGroup>
+ <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+ <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+ </PropertyGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
+ <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target> -->
+ <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
+ <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
+ </Target>
+ <ProjectExtensions>
+ <VisualStudio>
+ <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+ <WebProjectProperties>
+ <UseIIS>False</UseIIS>
+ <AutoAssignPort>False</AutoAssignPort>
+ <DevelopmentServerPort>26641</DevelopmentServerPort>
+ <DevelopmentServerVPath>/</DevelopmentServerVPath>
+ <IISUrl>
+ </IISUrl>
+ <NTLMAuthentication>False</NTLMAuthentication>
+ <UseCustomServer>False</UseCustomServer>
+ <CustomServerUrl>
+ </CustomServerUrl>
+ <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+ </WebProjectProperties>
+ </FlavorProperties>
+ </VisualStudio>
+ </ProjectExtensions>
+</Project>
View
28 MvcMusicStore/MvcMusicStore.csproj.user
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ProjectExtensions>
+ <VisualStudio>
+ <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+ <WebProjectProperties>
+ <StartPageUrl>
+ </StartPageUrl>
+ <StartAction>CurrentPage</StartAction>
+ <AspNetDebugging>True</AspNetDebugging>
+ <SilverlightDebugging>False</SilverlightDebugging>
+ <NativeDebugging>False</NativeDebugging>
+ <SQLDebugging>False</SQLDebugging>
+ <ExternalProgram>
+ </ExternalProgram>
+ <StartExternalURL>
+ </StartExternalURL>
+ <StartCmdLineArguments>
+ </StartCmdLineArguments>
+ <StartWorkingDirectory>
+ </StartWorkingDirectory>
+ <EnableENC>False</EnableENC>
+ <AlwaysStartWebServerOnDebug>True</AlwaysStartWebServerOnDebug>
+ </WebProjectProperties>
+ </FlavorProperties>
+ </VisualStudio>
+ </ProjectExtensions>
+</Project>
View
35 MvcMusicStore/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("MvcMusicStore")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("MvcMusicStore")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("aa8178f5-d968-4908-ae56-7235477f1139")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
View
30 MvcMusicStore/Web.Debug.config
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+ <!--
+ In the example below, the "SetAttributes" transform will change the value of
+ "connectionString" to use "ReleaseSQLServer" only when the "Match" locator
+ finds an atrribute "name" that has a value of "MyDB".
+
+ <connectionStrings>
+ <add name="MyDB"
+ connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
+ xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+ </connectionStrings>
+ -->
+ <system.web>
+ <!--
+ In the example below, the "Replace" transform will replace the entire
+ <customErrors> section of your web.config file.
+ Note that because there is only one customErrors section under the
+ <system.web> node, there is no need to use the "xdt:Locator" attribute.
+
+ <customErrors defaultRedirect="GenericError.htm"
+ mode="RemoteOnly" xdt:Transform="Replace">
+ <error statusCode="500" redirect="InternalError.htm"/>
+ </customErrors>
+ -->
+ </system.web>
+</configuration>
View
31 MvcMusicStore/Web.Release.config
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+ <!--
+ In the example below, the "SetAttributes" transform will change the value of
+ "connectionString" to use "ReleaseSQLServer" only when the "Match" locator
+ finds an atrribute "name" that has a value of "MyDB".
+
+ <connectionStrings>
+ <add name="MyDB"
+ connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
+ xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+ </connectionStrings>
+ -->
+ <system.web>
+ <compilation xdt:Transform="RemoveAttributes(debug)" />
+ <!--
+ In the example below, the "Replace" transform will replace the entire
+ <customErrors> section of your web.config file.
+ Note that because there is only one customErrors section under the
+ <system.web> node, there is no need to use the "xdt:Locator" attribute.
+
+ <customErrors defaultRedirect="GenericError.htm"
+ mode="RemoteOnly" xdt:Transform="Replace">
+ <error statusCode="500" redirect="InternalError.htm"/>
+ </customErrors>
+ -->
+ </system.web>
+</configuration>
View
4 MvcMusicStore/assets/css/bootstrap-responsive.min.css
@@ -0,0 +1,4 @@
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+.hidden{display:none;visibility:hidden;}
+@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.801104972%;} .row-fluid>.span2{width:14.364640883%;} .row-fluid>.span3{width:22.928176794%;} .row-fluid>.span4{width:31.491712705%;} .row-fluid>.span5{width:40.055248616%;} .row-fluid>.span6{width:48.618784527%;} .row-fluid>.span7{width:57.182320438000005%;} .row-fluid>.span8{width:65.74585634900001%;} .row-fluid>.span9{width:74.30939226%;} .row-fluid>.span10{width:82.87292817100001%;} .row-fluid>.span11{width:91.436464082%;} .row-fluid>.span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.982905983%;} .row-fluid>.span2{width:14.529914530000001%;} .row-fluid>.span3{width:23.076923077%;} .row-fluid>.span4{width:31.623931624%;} .row-fluid>.span5{width:40.170940171000005%;} .row-fluid>.span6{width:48.717948718%;} .row-fluid>.span7{width:57.264957265%;} .row-fluid>.span8{width:65.81196581200001%;} .row-fluid>.span9{width:74.358974359%;} .row-fluid>.span10{width:82.905982906%;} .row-fluid>.span11{width:91.45299145300001%;} .row-fluid>.span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
View
632 MvcMusicStore/assets/css/bootstrap.min.css
@@ -0,0 +1,632 @@
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
+a{color:#0088cc;text-decoration:none;}
+a:hover{color:#005580;text-decoration:underline;}
+.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
+.row:after{clear:both;}
+[class*="span"]{float:left;margin-left:20px;}
+.span1{width:60px;}
+.span2{width:140px;}
+.span3{width:220px;}
+.span4{width:300px;}
+.span5{width:380px;}
+.span6{width:460px;}
+.span7{width:540px;}
+.span8{width:620px;}
+.span9{width:700px;}
+.span10{width:780px;}
+.span11{width:860px;}
+.span12,.container{width:940px;}
+.offset1{margin-left:100px;}
+.offset2{margin-left:180px;}
+.offset3{margin-left:260px;}
+.offset4{margin-left:340px;}
+.offset5{margin-left:420px;}
+.offset6{margin-left:500px;}
+.offset7{margin-left:580px;}
+.offset8{margin-left:660px;}
+.offset9{margin-left:740px;}
+.offset10{margin-left:820px;}
+.offset11{margin-left:900px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
+.row-fluid:after{clear:both;}
+.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
+.row-fluid>[class*="span"]:first-child{margin-left:0;}
+.row-fluid>.span1{width:6.382978723%;}
+.row-fluid>.span2{width:14.89361702%;}
+.row-fluid>.span3{width:23.404255317%;}
+.row-fluid>.span4{width:31.914893614%;}
+.row-fluid>.span5{width:40.425531911%;}
+.row-fluid>.span6{width:48.93617020799999%;}
+.row-fluid>.span7{width:57.446808505%;}
+.row-fluid>.span8{width:65.95744680199999%;}
+.row-fluid>.span9{width:74.468085099%;}
+.row-fluid>.span10{width:82.97872339599999%;}
+.row-fluid>.span11{width:91.489361693%;}
+.row-fluid>.span12{width:99.99999998999999%;}
+.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
+.container:after{clear:both;}
+.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
+.container-fluid:after{clear:both;}
+p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
+.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
+h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
+h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
+h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
+h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
+h4,h5,h6{line-height:18px;}
+h4{font-size:14px;}h4 small{font-size:12px;}
+h5{font-size:12px;}
+h6{font-size:11px;color:#999999;text-transform:uppercase;}
+.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
+.page-header h1{line-height:1;}
+ul,ol{padding:0;margin:0 0 9px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+ul{list-style:disc;}
+ol{list-style:decimal;}
+li{line-height:18px;}
+ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
+dl{margin-bottom:18px;}
+dt,dd{line-height:18px;}
+dt{font-weight:bold;}
+dd{margin-left:9px;}
+hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
+strong{font-weight:bold;}
+em{font-style:italic;}
+.muted{color:#999999;}
+abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;}
+blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
+blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
+blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
+small{font-size:100%;}
+cite{font-style:normal;}
+code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
+pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;}
+pre code{padding:0;color:inherit;background-color:transparent;border:0;}
+.pre-scrollable{max-height:340px;overflow-y:scroll;}
+form{margin:0 0 18px;}
+fieldset{padding:0;margin:0;border:0;}
+legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;}
+label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
+input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
+label{display:block;margin-bottom:5px;color:#333333;}
+input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.uneditable-textarea{width:auto;height:auto;}
+label input,label textarea,label select{display:block;}
+input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;}
+input[type="image"]{border:0;}
+input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
+select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
+input[type="file"]{line-height:18px \9;}
+select{width:220px;background-color:#ffffff;}
+select[multiple],select[size]{height:auto;}
+input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+textarea{height:auto;}
+input[type="hidden"]{display:none;}
+.radio,.checkbox{padding-left:18px;}
+.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
+.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
+.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
+.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
+input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
+input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
+input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.input-mini{width:60px;}
+.input-small{width:90px;}
+.input-medium{width:150px;}
+.input-large{width:210px;}
+.input-xlarge{width:270px;}
+.input-xxlarge{width:530px;}
+input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
+input.span1,textarea.span1,.uneditable-input.span1{width:50px;}
+input.span2,textarea.span2,.uneditable-input.span2{width:130px;}
+input.span3,textarea.span3,.uneditable-input.span3{width:210px;}
+input.span4,textarea.span4,.uneditable-input.span4{width:290px;}
+input.span5,textarea.span5,.uneditable-input.span5{width:370px;}
+input.span6,textarea.span6,.uneditable-input.span6{width:450px;}
+input.span7,textarea.span7,.uneditable-input.span7{width:530px;}
+input.span8,textarea.span8,.uneditable-input.span8{width:610px;}
+input.span9,textarea.span9,.uneditable-input.span9{width:690px;}
+input.span10,textarea.span10,.uneditable-input.span10{width:770px;}
+input.span11,textarea.span11,.uneditable-input.span11{width:850px;}
+input.span12,textarea.span12,.uneditable-input.span12{width:930px;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
+.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
+.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
+.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
+.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
+.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
+.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
+.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
+.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
+.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
+input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
+.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;}
+.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+:-moz-placeholder{color:#999999;}
+::-webkit-input-placeholder{color:#999999;}
+.help-block{display:block;margin-top:5px;margin-bottom:0;color:#999999;}
+.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;}
+.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";}
+.input-prepend:after,.input-append:after{clear:both;}
+.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
+.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
+.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on{*margin-top:1px;}
+.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;}
+.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;}
+.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
+.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;}
+.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
+.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;}
+.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;}
+.form-search .radio,.form-inline .radio,.form-search .checkbox,.form-inline .checkbox{margin-bottom:0;vertical-align:middle;}
+.control-group{margin-bottom:9px;}
+legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
+.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
+.form-horizontal .control-group:after{clear:both;}
+.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
+.form-horizontal .controls{margin-left:160px;}
+.form-horizontal .form-actions{padding-left:160px;}
+table{max-width:100%;border-collapse:collapse;border-spacing:0;}
+.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd;}
+.table th{font-weight:bold;}
+.table thead th{vertical-align:bottom;}
+.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;}
+.table tbody+tbody{border-top:2px solid #ddd;}
+.table-condensed th,.table-condensed td{padding:4px 5px;}
+.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;}
+.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
+.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
+.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
+.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
+.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
+.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
+.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
+table .span1{float:none;width:44px;margin-left:0;}
+table .span2{float:none;width:124px;margin-left:0;}
+table .span3{float:none;width:204px;margin-left:0;}
+table .span4{float:none;width:284px;margin-left:0;}
+table .span5{float:none;width:364px;margin-left:0;}
+table .span6{float:none;width:444px;margin-left:0;}
+table .span7{float:none;width:524px;margin-left:0;}
+table .span8{float:none;width:604px;margin-left:0;}
+table .span9{float:none;width:684px;margin-left:0;}
+table .span10{float:none;width:764px;margin-left:0;}
+table .span11{float:none;width:844px;margin-left:0;}
+table .span12{float:none;width:924px;margin-left:0;}
+[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("/assets/images/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}
+.icon-white{background-image:url("/assets/images/glyphicons-halflings-white.png");}
+.icon-glass{background-position:0 0;}
+.icon-music{background-position:-24px 0;}
+.icon-search{background-position:-48px 0;}
+.icon-envelope{background-position:-72px 0;}
+.icon-heart{background-position:-96px 0;}
+.icon-star{background-position:-120px 0;}
+.icon-star-empty{background-position:-144px 0;}
+.icon-user{background-position:-168px 0;}
+.icon-film{background-position:-192px 0;}
+.icon-th-large{background-position:-216px 0;}
+.icon-th{background-position:-240px 0;}
+.icon-th-list{background-position:-264px 0;}
+.icon-ok{background-position:-288px 0;}
+.icon-remove{background-position:-312px 0;}
+.icon-zoom-in{background-position:-336px 0;}
+.icon-zoom-out{background-position:-360px 0;}
+.icon-off{background-position:-384px 0;}
+.icon-signal{background-position:-408px 0;}
+.icon-cog{background-position:-432px 0;}
+.icon-trash{background-position:-456px 0;}
+.icon-home{background-position:0 -24px;}
+.icon-file{background-position:-24px -24px;}
+.icon-time{background-position:-48px -24px;}
+.icon-road{background-position:-72px -24px;}
+.icon-download-alt{background-position:-96px -24px;}
+.icon-download{background-position:-120px -24px;}
+.icon-upload{background-position:-144px -24px;}
+.icon-inbox{background-position:-168px -24px;}
+.icon-play-circle{background-position:-192px -24px;}
+.icon-repeat{background-position:-216px -24px;}