Прежде всего, спасибо Tyrsius, Romias и eth0 за их предложения.
Я решил, что не хочу использовать идентификатор для категории, и я не хотел создавать обработчик маршрута, поскольку это не решает проблему с корнем.
Вместо этого я создаю проверочный атрибут с именем "UsedAsUrl" и применил его к моему Category.Name в моей модели домена.
Это имеет преимущества встроенной проверки (хорошо для конечного пользователя) и хорошего повторного использования с точки зрения разработчика.
Итак, моя модель категории теперь выглядит следующим образом (обратите внимание на атрибут [UsedAsUrl]):
public class Category
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
[UsedAsUrl]
[MaxLength(50, ErrorMessage = "One word or groups of words please")]
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
И созданный мной атрибут выглядит так:
using System;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
namespace CommonWebsiteUtilities.Attributes
{
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class UsedAsUrlAttribute : ValidationAttribute
{
public UsedAsUrlAttribute() : base("Must not contain a slash with spaces either side") {}
public override bool IsValid(object value)
{
var input = value.ToString();
var result = true;
if (input.Contains("/"))
{
input = Regex.Replace(input, @"\s+", " ");
if (input.Contains(" /")) result = false;
if (input.Contains("/ ")) result = false;
if (input.Contains(" / ")) result = false;
}
return result;
}
}
}
Теперь, когда я иду, чтобы добавить категорию:
![adding a category that I know will fail validation](https://i.stack.imgur.com/5mIvX.png)
Я получаю этот ответ автоматически:
![Failed response with validation](https://i.stack.imgur.com/NQVqR.png)
JS еще не работает, но мой контроллер может определить состояние модели, и это ответ от него, поэтому атрибут работает правильно.
Это в основном проверяет косую черту с пробелами с любой / любой стороны. Обратите внимание, что это не полный валидатор URL, но он подойдет для моего текущего проекта. Если у кого-то есть какие-либо улучшения, пожалуйста, дайте мне знать, и я исправлю этот ответ.
Я не очень хорошо с RegExp, поэтому не наследовал от RegularExpressionAttribute, а также я не хотел предоставлять сообщение об ошибке внутри моей модели. Этот атрибут действительно должен быть построен, поскольку при использовании категорий в качестве частей URL появляется больше правил.