2011-01-13 10 views
13

Mam wynik działania ExcelResult, który zwraca dokumenty Microsoft Excel, w oparciu o Stephen Walther tip. Zasadniczo po prostu wypuszcza strumień do odpowiedzi. Podczas debugowania VS 2010 (ASP.NET Dev Server), to działa dobrze, ale gdy uruchamiam go na polu IIS 6, pojawia się następujący błąd:Uruchomienie kontrolera MVC bez widoku?

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

Nie ma powiązanych widzenia, a zatem nie ma pliku , ale nie powinno być. Co ja robię źle?

UPDATE

Po prostu powrocie void zamiast ActionResult, nie mam już tego problemu. Zamiast zwracania ciągu ExcelResult, jawnie nazywam go metodą ExecuteResult, która zapisuje do strumienia wyjściowego.

Przed

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

Po

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

potem miałem problemy z bezpieczeństwem z moim uwierzytelniania NTLM, ale oni 'odeszli' (co oznacza, że ​​oczekujemy od nich wrócić). Na razie jednak wszystko działa poprawnie.

+1

Czy nie uważasz, że trudno jest powiedzieć, co robisz źle, nie pokazując, co robisz (jakiś kod lub coś takiego)? Niestety nie mam umiejętności telepatycznych. –

+0

Cóż, zasadniczo można wyświetlić kod na łączu. Zwraca ActionResult, który naprawdę jest ExcelResult, którego metoda ExecuteResult zapisuje do strumienia wyjściowego. – DougJones

Odpowiedz

13

upewnić się, że metody działania nie zwraca ActionResult:

public void DoSomething() 
+3

Oh, żadna akcja nie powinna zwrócić ActionResult. W tym przypadku chce 'ExcelResult', który jest niestandardowym wynikiem akcji, ale nadal wynikiem działania. –

+0

Każda publiczna metoda w kontrolerze jest metodą działania i można ją wywołać odpowiednim adresem URL. Podczas pisania strumienia w odpowiedzi może działać. –

+0

To doprowadziło mnie do innego błędu! Właśnie zobaczyłem pustą stronę zamiast załączonego dokumentu Excel. Widziałem w Fiddler teraz otrzymuję błąd odmowy dostępu 401 nad uwierzytelniania Windows NTLM, ale inne działania kontrolera (z widokami) wyświetlają się dobrze. – DougJones

0

nie spojrzeć na kod na skutek działania w wiele szczegółów, ale to musi być coś nie tak z wyniku działania. Czy odziedziczyłeś po innym wyniku akcji, w przeciwieństwie do klasy ActionResult? Czy nazwałeś base.ExecuteResult? Jeśli tak, to wyjaśniałoby to, dlaczego szuka widoku. Stworzyłem kilka niestandardowych działań kontrolera, aby zwrócić różne typy plików i nigdy nie szukają widoku.

Zgadzam się z uwagami dotyczącymi odpowiedzi, które mówią, że zwrot jest nieważny. To zdecydowanie jest hack. Nie powinieneś wywoływać ExecuteResult z wnętrza swojej akcji. Zasadniczo piszesz bezpośrednio do strumienia odpowiedzi z działania kontrolera. Oczywiście działa, ale to naprawdę nie pasuje do modelu MVC.

3

Jest to przydatne w scenariuszu, gdy mamy setki lub tysiące widoków. Czy w takim przypadku stworzymy setki lub tysiące akcji kontrolera? Oczywiście, że nie, to jak możemy to naprawić?

W środowisku MVC klasa kontrolera zawiera metodę HandleUnknownAction(), która jest wykonywana za każdym razem, gdy spróbujemy wywołać akcję (lub gdy zażądamy widoku, który nie ma odpowiedniej metody działania) na kontrolerze, który nie istnieje .

enter image description here

wierzę, to odpowiedzi na swoje pytanie.