Наилучший способ сделать это - использовать пользовательский поставщик значений. В то время как вы можете сделать это, используя полное настраиваемое связующее устройство, это перебор, основанный на ваших требованиях, и намного проще реализовать собственный поставщик стоимости.
Для получения дополнительной информации о том, когда вы используете специализированное связующее устройство и когда использовать пользовательский поставщик значений, см. here и here.
Вы можете просто создать поставщика настраиваемых значений для обработки значений маршрута, имеющих ключ «флаг», и обработать int для преобразования bool в поставщика значений. Код, чтобы сделать это выглядит примерно так:
public class IntToBoolValueProvider : IValueProvider
{
public IntToBoolValueProvider(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
this._context = context;
}
public bool ContainsPrefix(string prefix)
{
return prefix.ToLower().IndexOf("flag") > -1;
}
public ValueProviderResult GetValue(string key)
{
if (ContainsPrefix(key))
{
int value = 0;
int.TryParse(_context.RouteData.Values[key].ToString(), out value);
bool result = value > 0;
return new ValueProviderResult(result, result.ToString(), CultureInfo.InvariantCulture);
}
else
{
return null;
}
}
ControllerContext _context;
}
public class IntToBoolValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
return new IntToBoolValueProvider(controllerContext);
}
}
В поставщике значения, вы реализуете метод ContainsPrefix возвращать верно для ключей значений маршрута вы заинтересованы в этом случае ключа «флаг». В флаге GetValue вы преобразовываете значение записи данных маршрута «флаг» в int, а затем в логическое, в зависимости от того, является ли int больше нуля. Для всех других ключей данных маршрута, которые не являются «флагом», вы просто возвращаете значение null, которое сообщает инфраструктуре MVC игнорировать этот ValueProvider и перейти к другим поставщикам стоимости.
Чтобы подключить это устройство, вам необходимо реализовать подкласс ValueProviderFactory, который создает пользовательский поставщик IntToBoolValueProvider. Кроме того, вам необходимо зарегистрировать эту фабрику с картой MVC. Вы делаете это в глобальном масштабе.asax используя статический ValueProviderFactories класс:
protected void Application_Start()
{
ValueProviderFactories.Factories.Insert(0, new IntToBoolValueProviderFactory());
}
Если затем маршрут создан следующим образом:
routes.MapRoute("", "{controller}/foo/{flag}", new { action = "Foo" });
этот маршрут будет направлять запросы на
http://localhost:60286/Home/Foo/{flag}
методу действия
public ActionResult Foo(bool flag)
{
//Implement action method
return View("Index");
}
Когда сегмент {flag} больше 0, входной параметр флага bool будет true, а когда он равен нулю, параметр флага будет false.
Дополнительную информацию о поставщиках услуг MVC можно найти here.
вы хотите создать собственные маршруты. 2 или 3 из них. Добавьте несколько примеров URL-адресов для работы. Также объясните, будут ли эти конечные точки вообще отличаться от ваших стандартных маршрутов. Если они сделают (начнут с чего-то вроде bool), это будет лучше. –