Неоднозначные методы действия в MVC 2 - PullRequest
2 голосов
/ 20 апреля 2011

У меня возникли некоторые проблемы с методами неоднозначного действия в MVC 2. Я попытался реализовать решение, найденное здесь: Методы неоднозначного действия ASP.NET MVC , но это просто дает мне «ресурс ошибка не может быть найдена, поскольку он думает, что я пытаюсь вызвать метод действия, который я не хочу вызвать. Класс RequiredRequestValueAttribute, который я использую, точно такой же, как и в решении другого вопроса:

public class RequireRequestValueAttribute : ActionMethodSelectorAttribute
{
    public RequireRequestValueAttribute(string valueName)
    {
        ValueName = valueName;
    }
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return (controllerContext.HttpContext.Request[ValueName] != null);
    }
    public string ValueName { get; private set; }
}

Мои методы действия:

    //
    // GET: /Reviews/ShowReview/ID

    [RequireRequestValue("id")]
    public ActionResult ShowReview(int id)
    {
        var game = _gameRepository.GetGame(id);

        return View(game);
    }

    //
    // GET: /Reviews/ShowReview/Title

    [RequireRequestValue("title")]
    public ActionResult ShowReview(string title)
    {
        var game = _gameRepository.GetGame(title);

        return View(game);
    }

Сейчас я пытаюсь использовать версию int id, и вместо этого она вызывает версию string title.

1 Ответ

2 голосов
/ 20 апреля 2011

В этом решении предполагается, что вы должны использовать один и тот же URL-адрес независимо от того, выбираете ли вы по идентификатору или имени, и что ваш маршрут настроен для передачи значения этому методу из URL-адреса.

[RequireRequestValue("gameIdentifier")]
public ActionResult ShowReview(string gameIdentifier)
{
    int gameId;
    Game game = null;
    var isInteger = Int32.TryParse(gameIdentifier, out gameId);

    if(isInteger)
    {
      game = _gameRepository.GetGame(gameId);
    }
    else
    {
      game = _gameRepository.GetGame(gameIdentifier);
    }

    return View(game);
}

Обновление: Согласно Microsoft : «Методы действий не могут быть перегружены на основе параметров. Методы действий могут быть перегружены, если они устранены неоднозначностью с такими атрибутами, как NonActionAttribute или AcceptVerbsAttribute."

...