public IActionResult New() {
			var x = RouteData.Values;
			ViewData["Title"] = "New blog";
			ViewData["IsAuthed"] = IsAuthed();
			var model = new BlogEntry();
			return View("Edit", model);
		}
		public IActionResult Preview(string title, string slug, string markdownContent) {
			return ApiResponse(() => {
				if (!IsAuthed()) return NotAuthedApiResponse();
				ViewData["IsAuthed"] = true;
				var now = DateTimeOffset.Now;
				var model = new BlogEntry {
					MarkdownContent = markdownContent,
					HtmlContent = CommonMark.CommonMarkConverter.Convert(markdownContent),
					Title = title,
					Slug = slug,
					DateCreated = now,
					DateLastModified = now,
					DatePublished = now
				};
				return RenderPartialViewToString("_BlogEntry", model);
			});
		}
		public IActionResult Save(Guid entryId, string title, string slug, string markdownContent) {
			return ApiResponse(() => {
				if (!IsAuthed()) return NotAuthedApiResponse();

				var htmlContent = CommonMark.CommonMarkConverter.Convert(markdownContent);
				var now = DateTimeOffset.Now;

				BlogEntry model;
				if (entryId == Guid.Empty) {
					model = new BlogEntry {
						MarkdownContent = markdownContent,
						HtmlContent = htmlContent,
						Title = title,
						Slug = slug,
						DateCreated = now,
						DateLastModified = now,
						DatePublished = now
					};
				} else {
					// TODO: Handle lookup failure
					model = _blogService.GetById(entryId);
					model.MarkdownContent = markdownContent;
					model.HtmlContent = htmlContent;
					model.Title = title;
					model.Slug = slug;
					model.DateLastModified = now;
				}

				_blogService.SaveBlogEntry(model);

				return new { RedirectUrl = model.Url };
			});
		}