public async Task <IActionResult> ByTag(string variant, string tag) { if (Regex.IsMatch(tag, "[^0-9a-zA-Z-]")) { return(ViewResultForHttpError(HttpContext, new HttpErrors.NotFound("Invalid tag."))); } tag = tag.ToLowerInvariant(); List <Puzzle> puzzles = await puzzleRepository.FindByVariantAndTag(variant, tag) ?? new List <Puzzle>(); if (puzzles.Count == 0) { await tagRepository.MaybeRemoveTagAsync(variant, tag); return(ViewResultForHttpError(HttpContext, new HttpErrors.NotFound("That tag has no puzzles for this variant."))); } PuzzleTag tagDetails = await tagRepository.FindTag(variant, tag); ViewBag.Variant = tagDetails.Variant; ViewBag.Tag = tagDetails.Name; ViewBag.Description = tagDetails.Description; return(View(puzzles.Select(p => p.ID).OrderBy(x => x).ToList())); }