Кто-либо может указать на меня в правильном направлении о том, как отобразить маршрут, который требует двух гуидов?
т.е. http://blah.com/somecontroller/someaction/{firstGuid} / {secondGuid}
где и firstGuid и secondGuid не являются дополнительными и должны быть системы типов. Гуид?
Создайте RouteConstraint следующим образом:
public class GuidConstraint : IRouteConstraint {
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (values.ContainsKey(parameterName))
{
string stringValue = values[parameterName] as string;
if (!string.IsNullOrEmpty(stringValue))
{
Guid guidValue;
return Guid.TryParse(stringValue, out guidValue) && (guidValue != Guid.Empty);
}
}
return false;
}}
Далее при добавлении маршрута:
routes.MapRoute("doubleGuid", "{controller}/{action}/{guid1}/{guid2}", new { controller = "YourController", action = "YourAction" }, new { guid1 = new GuidConstraint(), guid2 = new GuidConstraint() });
+1 @kazimanzurrashid. Кажется, в точку.
Приведу альтернативу для тех, у кого нет C#4.0, частью которого является Guid.TryParse. Есть еще одна альтернатива с Regex, но вероятно, не стоит заморачиваться.
public class GuidConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (values.ContainsKey(parameterName))
{
string stringValue = values[parameterName] as string;
if (!string.IsNullOrEmpty(stringValue))
{
//replace with Guid.TryParse when available.
try
{
Guid guid = new Guid(stringValue);
return true;
}
catch
{
return false;
}
}
}
return false;
}
}