У меня есть два метода действия, которые вызываются с использованием одного и того же имени действия, однако в зависимости от фактического типа параметра зависит, какой метод следует вызвать. Это вызывает двусмысленность. Я создал атрибут, который определяет, является ли параметр Guid и является ли он подходящим методом.
[RequiredGuidParameter(ParameterName = "title")]
[ActionName("Title")]
public ActionResult Item_ById(Guid id)
{ ... }
[ActionName("Title")]
public ActionResult Item_ByName(string id)
{ ... }
Атрибут выглядит так:
public string ParameterName = string.Empty;
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
object parameter = null;
try
{
parameter = controllerContext.RouteData.GetRequiredString(ParameterName) as object;
if (parameter != null)
{
Guid guid;
return Guid.TryParse((string)parameter, out guid);
}
}
catch { }
parameter = controllerContext.RequestContext.HttpContext.Request[ParameterName] as object;
if (parameter != null)
{
Guid guid;
return Guid.TryParse((string)parameter, out guid);
}
return false;
}
Конечная цель состоит в том, чтобы, если параметром был Guid, запустить этот метод, в противном случае двигаться дальше, и в этом случае он находит следующий. Есть ли лучший способ, который не предусматривает создание дополнительного маршрута? Или, может быть, лучше все вокруг?