Exécuter MVC contrôleur de l'action sans la vue?
J'ai un ExcelResult action résultat qui renvoie les documents Microsoft Excel, en fonction de la Stephen Walther astuce. Fondamentalement, il écrit simplement un flux pour la Réponse. Lors du débogage de VS 2010 (ASP.NET Serveur de Dev), il fonctionne très bien, mais quand je le lance sur un IIS 6 case, j'obtiens l'erreur suivante:
La vue 'GenerateExcel" ou son maître n'a pas été trouvé. Les emplacements suivants ont été recherchés:
~/Views/Home/GenerateExcel.aspx
~/Views/Home/GenerateExcel.ascx
~/Views/Shared/GenerateExcel.aspx
~/Views/Shared/GenerateExcel.ascx
Il n'y a pas de Vue, et par conséquent pas de fichier, mais il ne devrait pas être le cas. Ce que je fais mal?
Mise à JOUR
Simplement en retournant void au lieu d'une ActionResult, je n'ai plus ce problème. Au lieu de retourner le ExcelResult, je suis en appelant explicitement c'est ExecuteResult méthode, ce qui est écrit sur le flux de sortie.
Avant
public ActionResult GenerateExcel()
{
return this.Excel(parameters);
}
Après
public void GenerateExcel()
{
ExcelResult excelResult = this.Excel(parameters);
excelResult.ExecuteResult(null);
}
Après, j'ai eu des problèmes de sécurité avec mon authentification NTLM, mais qu'ils "s'en alla" (signifie que j'attends d'eux de revenir). Pour l'instant, tout fonctionne correctement.
Ainsi vous pouvez afficher le code sur le lien. C'est au retour d'une ActionResult c'est vraiment un ExcelResult dont ExecuteResult méthode est écrit sur le flux de sortie.
OriginalL'auteur DougJones | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que votre méthode d'action ne renvoie pas un ActionResult:
ExcelResult
qui est une action personnalisée résultat, mais encore une action en conséquence.Chaque méthode publique dans un contrôleur est une méthode d'action et peut être appelé par des URL. Alors qu'il est écrit d'un flux dans la Réponse qu'il peut travailler.
Qui m'a fait une autre erreur! Je viens de voir une page blanche au lieu de la excel joint doc. J'ai vu dans un violon, je suis maintenant un 401 erreur d'accès refusé sur le NTLM l'authentification windows, bien que les autres actions du contrôleur (avec vue) affichage de l'amende juste.
OriginalL'auteur
C'est tout à fait utile dans un scénario où nous avons des centaines ou des milliers de vues. Seront, dans ce cas, nous créons des centaines ou des milliers d'actions de contrôleur? Bien sûr que non, alors comment pouvons-nous résoudre ce problème?
Dans le Framework MVC, le contrôleur de classe contient une méthode, HandleUnknownAction(), qui s'exécute à chaque fois que nous essayons d'appeler une action (ou lorsque nous demandons un point de vue qui n'a pas de correspondance de la méthode d'action) sur un contrôleur qui n'existe pas.
Je crois que cela répond à votre question.
OriginalL'auteur
Je n'ai pas regardé le code de l'action résultat dans beaucoup de détails, mais il doit y avoir quelque chose de mal avec votre action résultat. Avez-vous hériter d'une autre action résultat par opposition à la classe ActionResult? Avez-vous l'appel de la base.ExecuteResult? Si oui, cela expliquerait pourquoi il est à la recherche de la vue. J'ai créé plusieurs personnalisée actions de contrôleur pour revenir à différents types de fichiers et ils ne recherchent jamais d'un point de vue.
Je suis d'accord avec les commentaires sur la réponse en disant: retour à vide. Qui est certainement un hack. Vous ne devez pas appeler ExecuteResult de l'intérieur de votre action. Vous êtes fondamentalement écrire directement dans le flux de réponse à partir de votre contrôleur de l'action. Évidemment, il fonctionne, mais il n'a pas vraiment d'ajustement du modèle MVC.
OriginalL'auteur