public async Task <ActionResult> CreatePOST(CreateTypeViewModel viewModel) { if (!await _authorizationService.AuthorizeAsync(User, Permissions.EditContentTypes)) { return(Forbid()); } viewModel.DisplayName = viewModel.DisplayName?.Trim() ?? String.Empty; viewModel.Name = viewModel.Name ?? String.Empty; if (String.IsNullOrWhiteSpace(viewModel.DisplayName)) { ModelState.AddModelError("DisplayName", S["The Display Name can't be empty."]); } if (_contentDefinitionService.LoadTypes().Any(t => String.Equals(t.DisplayName.Trim(), viewModel.DisplayName.Trim(), StringComparison.OrdinalIgnoreCase))) { ModelState.AddModelError("DisplayName", S["A type with the same Display Name already exists."]); } if (String.IsNullOrWhiteSpace(viewModel.Name)) { ModelState.AddModelError("Name", S["The Technical Name can't be empty."]); } if (!String.IsNullOrWhiteSpace(viewModel.Name) && !viewModel.Name[0].IsLetter()) { ModelState.AddModelError("Name", S["The Technical Name must start with a letter."]); } if (!String.Equals(viewModel.Name, viewModel.Name.ToSafeName(), StringComparison.OrdinalIgnoreCase)) { ModelState.AddModelError("Name", S["The Technical Name contains invalid characters."]); } if (viewModel.Name.IsReservedContentName()) { ModelState.AddModelError("Name", S["The Technical Name is reserved for internal use."]); } if (_contentDefinitionService.LoadTypes().Any(t => String.Equals(t.Name.Trim(), viewModel.Name.Trim(), StringComparison.OrdinalIgnoreCase))) { ModelState.AddModelError("Name", S["A type with the same Technical Name already exists."]); } if (!ModelState.IsValid) { await _documentStore.CancelAsync(); return(View(viewModel)); } var contentTypeDefinition = _contentDefinitionService.AddType(viewModel.Name, viewModel.DisplayName); var typeViewModel = new EditTypeViewModel(contentTypeDefinition); await _notifier.SuccessAsync(H["The \"{0}\" content type has been created.", typeViewModel.DisplayName]); return(RedirectToAction("AddPartsTo", new { id = typeViewModel.Name })); }