Правильное использование атрибута для определения правильного метода для вызова - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть два метода действия, которые вызываются с использованием одного и того же имени действия, однако в зависимости от фактического типа параметра зависит, какой метод следует вызвать. Это вызывает двусмысленность. Я создал атрибут, который определяет, является ли параметр 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, запустить этот метод, в противном случае двигаться дальше, и в этом случае он находит следующий. Есть ли лучший способ, который не предусматривает создание дополнительного маршрута? Или, может быть, лучше все вокруг?

1 Ответ

0 голосов
/ 03 декабря 2010

Почему не что-то вроде:

public ActionResult Item_Search(string id, Guid guid)
{
    if( string.IsNullOrWhiteSpace(id) 
         SearchById();
     if( guid != new Guid() )
         SearchByGuid()
}

Не гарантированный код псевдо / \

...