Полиморфизм в методах действия MVC - PullRequest
3 голосов
/ 10 июля 2011

У меня есть два действия:

// Действие 1 public FileResult Download (папка строки, строка fileName) {...}

// Действие 2 publicЗагрузка FileResult (int id, string fileName) {...}

Когда я пытаюсь загрузить следующий URL: http://localhost:54630/Downloads/Download/15?fileName=sharedhostinggsg.pdf

Произошла ошибка: Текущий запрос действия «Загрузить» для контроллера типа «DownloadsController» неоднозначен между следующими методами действия: System.Web.Mvc.FileResult Загрузка (Int32) для типа SextaIgreja.Web.Controllers.DownloadsController System.Web.Скачать Mvc.FileResult (System.String, System.String) для типа SextaIgreja.Web.Controllers.DownloadsController

Как я могу их сделать:

URL: ../Downloads/Download/15?fileName=sharedhostinggsg.pdf Действие: действие 2

Url: ../Downloads?folder=Documentos$fileName=xx.docx Действие: действие 1

Я пытался наложить ограничение на мой маршрут, но не сработало:

routes.MapRoute(
    "Download", // Route name
    "Downloads/Download/{id}", // URL with parameters
    new { controller = "Downloads", action = "Download" },  // Parameter defaults
    new { id = @"\d+" }
    );

Seархивируя Интернет, я нашел несколько ссылок, но я не мог понять, как я могу решить мою проблему. Этот , например, атрибут RequireRequestValue не найден.Я не знаю, какое это пространство имен.

1 Ответ

3 голосов
/ 11 июля 2011

Упомянутое вами RequireRequestValue является пользовательским классом, который они создали (из Пример опубликован ), поэтому вы не найдете его ни в одном пространстве имен Microsoft.

Класс, который вы увидите, наследуется от ActionMethodSelectorAttribute. Этот класс атрибута можно использовать для фильтрации действий, аналогичных атрибуту AcceptVerbs. Как и в примере этой ссылки, они возвращают true или false в зависимости от того, указано ли значение в аргументах маршрута.

Итак, следуя приведенному вами примеру, создайте класс RequireRequestValueAttribute. Затем украсьте ваши два метода действий Загрузки так:

[RequireRequestValue("id")]
public FileResult Download(int id, string fileName) { ... }

[RequireRequestValue("folder")]
public FileResult Download(string folder, string fileName) { ... }
...