Retour Vue comme une Chaîne de caractères .NET de Base
J'ai trouvé un article, comment revenir de vue de la chaîne ASP.NET, mais ne pouvait pas secrète de tout pour être en mesure de le faire fonctionner avec .NET de Base
public static string RenderViewToString(this Controller controller, string viewName, object model)
{
var context = controller.ControllerContext;
if (string.IsNullOrEmpty(viewName))
viewName = context.RouteData.GetRequiredString("action");
var viewData = new ViewDataDictionary(model);
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
var viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
qui suppose d'être en mesure d'appeler à partir d'un Contrôleur à l'aide:
var strView = this.RenderViewToString("YourViewName", yourModel);
Lorsque j'essaie d'exécuter le dessus .NET de Base je reçois beaucoup d'erreurs de compilation.
J'ai essayé de le convertir à travailler avec .NET de Base, mais a échoué, n'importe qui peut aider avec de mentionner le nécessaire using ..
et le "dependencies": {
à être utilisé dans le
"Microsoft.AspNetCore.Mvc": "1.1.0",
...
},project.json
.
quelques autres exemples de codes sont ici et ici et ici
NOTE
J'ai besoin de la solution pour obtenir la vue converti à string
.NET de Base, indépendamment même code fut converti, ou d'une autre façon qui peut le faire.
OriginalL'auteur Hasan A Yousef | 2016-12-01
Vous devez vous connecter pour publier un commentaire.
Rouge de la réponse m'a fait 99% du chemin, mais il ne fonctionne pas si votre point de vue dans un endroit inattendu. Voici mon fix pour que.
Cela vous permet de l'utiliser en tant que ci-dessous:
OriginalL'auteur Pharylon
Grâce à Paris Polyzos et son l'article.
Je suis re-poster son code ici, juste au cas où le post original est supprimé pour une raison quelconque.
Créer
Service
dans le fichierviewToString.cs
comme le code ci-dessous:Ajouter le service à la
Startup.cs
fichier:Ajouter
"preserveCompilationContext": true
à labuildOptions
dans leproject.json
, de sorte que le fichier ressemble à ceci:Vous définir
model
, par exemple:Créer votre
Invite.cshtml
par exemple:Dans le
Controller
:un. Définir le ci-dessous au début:
b. L'appel et le retour de la vue avec le modèle ci-dessous:
c. La manette entièrement exemple, pourrait être:
Avec ce code ViewData["Message"] = "Votre demande de description de page."; sera nulle dans la vue. Pourquoi? Quelqu'un pourrait-il poster une version fixe qui contient la bonne gestion de ViewData, pas seulement modèle de vue.
vérifier ma réponse dans le post. J'ai collé un exemple de code de cshtml.
OriginalL'auteur Hasan A Yousef
Si comme moi vous avez un certain nombre de contrôleurs qui ont besoin de ce, comme dans un site de déclaration, il n'est pas vraiment idéal pour répéter ce code, et même l'injection ou en appelant un autre service ne semble pas vraiment droit.
J'ai donc fait ma propre version de ce qui précède avec les différences suivantes:
pas de DI nécessaire
Puis il suffit de mettre en œuvre avec:
Ou pour un PartialView:
Merci, excellente solution! La seule chose que j'ai changé, c'est l'ajout d'une enveloppé de la méthode d'extension pour des vues partielles. J'ai effectivement rencontré un petit problème lors de l'utilisation de la préalablement injecté ViewRenderService car il pourrait accéder à des vues partielles de l'arbre d'affichage des autres contrôleurs. Ces points de vue ne sont rendus correctement, mais ne serait jamais recompiler automatiquement au cours de débogage, de les déplacer à un échange de vues a résolu le problème!
pourriez-vous poster un exemple de la couverture de l'extension que vous avez mentionné?
Juste ajouter une autre méthode de la même classe d'extension que le Rouge a suggéré: "public static async Task<string> RenderPartialViewAsync<TModel>(ce Contrôleur contrôleur, chaîne nomvue, TModel modèle) { return attendent contrôleur.RenderViewAsync(nomvue, modèle, true); }`
Si ce code fait ce que vous avez besoin, vous pouvez simplement appeler directement
controller.RenderViewAsync(viewName, model, true);
. Je ne vois pas que vous êtes gagne quoi que ce soit, autre que de la rendre plus claire que c'est une Partielle, mais qui pourrait être important dans votre situation.OriginalL'auteur Red
Les réponses ci-dessus sont très bien, mais il faut bidouiller pour obtenir n'importe quelle balise aides de travail (nous avons besoin d'utiliser la réalité http contexte). Aussi, vous aurez besoin de définir explicitement
la mise en page dans la vue d'obtenir une mise en page rendus.
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Bizarrement a bien fonctionné localement, sans cela ...OriginalL'auteur Dave Glassborow
J'ai essayé la solution qui a répondu par @Hasan Un Yousef Dotnet Core 2.1, mais le csthml ne fonctionnent pas bien pour moi. Il jette toujours une exception NullReferenceException, voir la capture d'écran.
Pour le résoudre, je assigner le code Html.ViewData.Modèle à un nouvel objet. Voici mon code.
Cela fonctionne, mais le problème est la directive @page qui marque comme un Rasoir Page. Et les Pages Razor fonctionnent différemment de Rasoir points de Vue. Voir cette autre SORTE de solution pour un moyen d'ajouter le Modèle à un Rasoir Page: stackoverflow.com/a/49275145/943435
OriginalL'auteur Chan
Le lien ci-dessous aborde à peu près la même question:
Où sont les ControllerContext et ViewEngines propriétés dans MVC 6 Contrôleur?
À Hasan Un Yousef réponse que j'ai eu à faire le même changement que dans le lien ci-dessus pour le faire fonctionner moi:
Votre accueil @ppumkin, j'ai passé un long temps à essayer de comprendre cela, et j'avais besoin de ce mal.
OriginalL'auteur Richard Mneyan
Microsoft a un excellent article sur le Test d'un Contrôleur à https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing
Une fois que vous avez retourné une ViewResult alors vous pouvez obtenir la chaîne de contenu par
var strResult = ViewResult.Contenu
error CS0117: 'ViewResult' doesn't contain a definition for 'Content'
OriginalL'auteur John Davidson