2011-01-13 11 views
13

Ho un risultato di azione ExcelResult che restituisce documenti Microsoft Excel, in base allo Stephen Walther tip. Fondamentalmente scrive solo un flusso verso la risposta. Quando il debug VS 2010 (ASP.NET Dev Server), funziona benissimo, ma quando lo faccio funzionare su una scatola di IIS 6, ottengo il seguente errore:Esegui l'azione del controller MVC senza visualizzazione?

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

Non c'è vista associata, e quindi nessun file ma non dovrebbe esserci. Che cosa sto facendo di sbagliato?

UPDATE

Semplicemente tornando vuoto al posto di un ActionResult, non ho più questo problema. Invece di restituire ExcelResult, sto chiamando esplicitamente il suo metodo ExecuteResult, che sta scrivendo sul flusso di output.

Prima

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

Dopo

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

Dopo di che, ho avuto problemi di sicurezza con la mia autenticazione NTLM, ma 'andato via' (nel senso mi aspetto che tornano). Per ora, però, tutto funziona correttamente.

+1

Non pensi che sia un po 'difficile dire cosa stai facendo male senza mostrare quello che stai facendo (del codice o qualcosa del genere)? Sfortunatamente non ho capacità telepatiche. –

+0

Bene, puoi praticamente vedere il codice sul link. Sta restituendo un ActionResult che è in realtà un ExcelResult il cui metodo ExecuteResult sta scrivendo nel flusso di output. – DougJones

risposta

13

Assicurati che il tuo metodo di azione non restituisce un ActionResult:

public void DoSomething() 
+3

Oh, nessuna azione dovrebbe restituire ActionResult. In questo caso vuole un 'ExcelResult', che è un risultato di azione personalizzato ma è comunque un risultato di azione. –

+0

Ogni metodo pubblico in un controller è un metodo di azione e può essere chiamato da un URL appropriato. Mentre sta scrivendo un flusso in risposta, può funzionare. –

+0

Questo mi ha fatto fare un errore diverso! Ho appena visto una pagina vuota al posto del documento excel allegato. Ho visto in Fiddler che ora ricevo un errore di accesso negato 401 sull'autenticazione Windows NTLM, sebbene le altre azioni del controller (con le visualizzazioni) vengano visualizzate correttamente. – DougJones

0

Non ho guardato il codice per il risultato dell'azione in molti dettagli, ma ci deve essere qualcosa di sbagliato con il vostro risultato azione. Hai ereditato da qualche altro risultato di azione rispetto alla classe ActionResult? Hai chiamato base.ExecuteResult? Se è così, questo spiegherebbe perché sta cercando la vista. Ho creato diverse azioni del controller personalizzato per restituire vari tipi di file e non cercano mai una vista.

Sono d'accordo con i commenti sulla risposta dicendo di restituire void. Questo è sicuramente un hack. Non dovresti chiamare ExecuteResult dall'interno della tua azione. In pratica stai scrivendo direttamente sul flusso di risposta dall'azione del tuo controller. Ovviamente funziona, ma in realtà non si adatta al modello MVC.

3

Questo è abbastanza utile in uno scenario in cui abbiamo centinaia o migliaia di visualizzazioni. In tal caso creeremo centinaia o migliaia di azioni del controller? Certo che no, allora come possiamo aggiustarlo?

In MVC Framework, la classe controller include un metodo, HandleUnknownAction(), che viene eseguito ogni volta che si tenta di richiamare un'azione (o quando si richiede una vista che non ha un metodo di azione corrispondente) su un controller che non esiste .

enter image description here

Credo, questo risponde alla tua domanda.

Problemi correlati