2011-01-13 4 views
13

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

The view 'GenerateExcel' or its master was not found. The following locations were searched: ~/Views/Home/GenerateExcel.aspx ~/Views/Home/GenerateExcel.ascx ~/Views/Shared/GenerateExcel.aspx ~/Views/Shared/GenerateExcel.ascx

Там нет связанных View, и поэтому нет файла , но не должно быть. Что я делаю не так?

UPDATE

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

Перед

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

После

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

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

+1

Разве вы не чувствуете, что немного сложно сказать, что вы делаете неправильно, не показывая, что вы делаете (какой-то код или что-то еще)? К сожалению, у меня нет телепатических навыков. –

+0

Ну вы можете в основном просмотреть код по ссылке. Он возвращает ActionResult, который действительно является ExcelResult, метод ExecuteResult записывается в выходной поток. – DougJones

ответ

13

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

public void DoSomething() 
+3

О, ни одно действие не должно возвращать ActionResult. В этом случае он хочет «ExcelResult», который является результатом пользовательского действия, но все же является результатом действия. –

+0

Каждый открытый метод в контроллере является методом действия и может быть вызван подходящим URL-адресом. Пока он пишет поток в Response, он может работать. –

+0

Это привело меня к другой ошибке! Я просто увидел пустую страницу вместо прилагаемого документа excel. Я видел в Fiddler. Теперь я получаю ошибку доступа 401 по поводу проверки подлинности Windows NTLM, хотя другие действия контроллера (с представлениями) отображаются очень хорошо. – DougJones

0

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

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

3

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

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

enter image description here

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