Запустить действие контроллера MVC без представления?

У меня есть результат действия ExcelResult, который возвращает документы Microsoft Excel, основываясь на совете Стивена Вальтера. В основном он просто пишет поток для ответа. При отладке VS 2010 (ASP.NET Dev Server) он работает нормально, но когда я запускаю его в ящике IIS 6, я получаю следующую ошибку:

Вид "GenerateExcel" или его мастер не найден. Были обысканы следующие местоположения: ~/Views/Home/GenerateExcel.aspx ~/Views/Home/GenerateExcel.ascx ~/Views/Shared/GenerateExcel.aspx ~/Views/Shared/GenerateExcel.ascx

Нет связанного представления и, следовательно, нет файла, но не должно быть. Что я делаю неправильно?

UPDATE

Просто вернув void вместо ActionResult, у меня больше нет этой проблемы. Вместо того, чтобы возвращать ExcelResult, я явно называю его методом ExecuteResult, который записывает в выходной поток.

До

public ActionResult GenerateExcel()
{
    return this.Excel(parameters);
}

После

    public void GenerateExcel()
{
ExcelResult excelResult = this.Excel(parameters);
excelResult.ExecuteResult(null);
}

После этого у меня были проблемы с безопасностью с моей аутентификацией NTLM, но они "ушли" (что означает, что я ожидаю, что они вернутся). Пока что все работает нормально.

Ответы

Ответ 1

Убедитесь, что ваш метод действия не возвращает ActionResult:

public void DoSomething()

Ответ 2

Это очень полезно в сценарии, когда у нас есть сотни или тысячи просмотров. Будет ли в этом случае создавать сотни или тысячи действий контроллера? Конечно, нет, тогда как мы можем это исправить?

В MVC Framework класс контроллера включает метод HandleUnknownAction(), который выполняется всякий раз, когда мы пытаемся вызвать действие (или когда мы запрашиваем представление, которое не имеет подходящего метода действий) на контроллере, который не существует.

enter image description here

Я считаю, это отвечает на ваш вопрос.

Ответ 3

Я не очень подробно смотрел на код результата действия, но в вашем результате действия должно быть что-то не так. Вы наследовали от какого-либо другого результата действия, а не класса ActionResult? Вы назвали base.ExecuteResult? Если это так, это объясняет, почему он ищет точку зрения. Я создал несколько пользовательских действий контроллера, чтобы возвращать различные типы файлов, и они никогда не ищут представления.

Я согласен с комментариями к ответу, говорящим, чтобы вернуть пустоту. Это определенно рушится. Вы не должны вызывать ExecuteResult из вашего действия. Вы в основном пишете прямо в поток ответов из действия вашего контроллера. Очевидно, что это работает, но это действительно не соответствует модели MVC.