Rendre Rasoir Vue de chaîne ASP.NET de Base
- Je utiliser RazorEngine pour l'analyse de modèles dans mon MVC 6 projet comme celui-ci:
Engine.Razor.RunCompile(File.ReadAllText(fullTemplateFilePath), templateName, null, model);
Il fonctionne très bien pour la bêta 6. Il ne fonctionne pas après la mise à niveau à la version bêta 7 avec l'erreur:
MissingMethodException: Méthode non trouvé: "Nul Microsoft.AspNet.De rasoir.CodeGenerators.GeneratedClassContext.set_ResolveUrlMethodName(Système d'.String)".
dans RazorEngine.La Compilation.CompilerServiceBase.CreateHost(Type templateType, Type modelType, String className)
C'est mondial.json:
{
"projects": [ "src", "test" ],
"sdk": {
"version": "1.0.0-beta7",
"runtime": "clr",
"architecture": "x64"
}
}
Ce projet.json:
...
"dependencies": {
"EntityFramework.SqlServer": "7.0.0-beta7",
"EntityFramework.Commands": "7.0.0-beta7",
"Microsoft.AspNet.Mvc": "6.0.0-beta7",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta7",
"Microsoft.AspNet.Authentication.Cookies": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.Facebook": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.Google": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.MicrosoftAccount": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.Twitter": "1.0.0-beta7",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta7",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-beta7",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-beta7",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta7",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta7",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta7",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-beta7",
"Microsoft.Framework.Configuration.Abstractions": "1.0.0-beta7",
"Microsoft.Framework.Configuration.Json": "1.0.0-beta7",
"Microsoft.Framework.Configuration.UserSecrets": "1.0.0-beta7",
"Microsoft.Framework.Logging": "1.0.0-beta7",
"Microsoft.Framework.Logging.Console": "1.0.0-beta7",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta7",
"RazorEngine": "4.2.2-beta1"
},
...
"frameworks": {
"dnx451": { }
},
...
Mon template est:
HTML:
@model dynamic
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Registration</title>
</head>
<body>
<p>
Hello, @Model
</p>
</body>
</html>
Quelqu'un aurait-il des problèmes similaires?
Il est une autre façon d'analyser les modèles MVC 6?
- Je n'ai pas lu la question, mais le vote pour la réponse 🙂
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR de juillet, 2016
Fonctionne bien sur les versions suivantes
1.0.0
,RC2
Qui ciblage aspnetcore RC2, cet extrait peut vous aider à:
Startup
classehttps://gist.github.com/ahmad-moussawi/1643d703c11699a6a4046e57247b4d09
Utilisation
Notes
Liens de Rasoir sont rendus comme relative URL, donc cela ne fonctionnera pas sur des vues externes (comme des emails, etc ...).
Que pour l'instant suis en générant le lien sur le contrôleur et le transmettre à la vue à travers le ViewModel.
De crédit
La source est extraite de (Merci À @pholly): https://github.com/aspnet/Entropy/blob/dev/samples/Mvc.RenderViewToString/RazorViewToStringRenderer.cs)
<a asp-controller="Whatever" asp-action="DoSomething" asp-route-thingy="ThingyValue">link text</a>
.UrlHelper
, etUrlHelper
besoins réels routedata ou elle lève une exception. Heureusement pour moi j'ai fais cela dans une application MVC, donc je peux utiliserIHttpContextAccessor
de construire unActionContext
avec de vraies valeursIUrlHelper
, heureux que vous avez trouvé une solution:)"copyToOutput": { "include": "Views" }
J'ai trouvé ce fil qui en parle: https://github.com/aspnet/Mvc/issues/3091
Quelqu'un dans le thread créé un exemple de service ici: https://github.com/aspnet/Entropy/blob/dev/samples/Mvc.RenderViewToString/RazorViewToStringRenderer.cs
Après essais et d'erreurs, j'ai été en mesure de couper le service de sorte qu'il ne nécessite qu'une seule valide
HttpContext
et unViewEngine
et j'ai ajouté une surcharge qui ne nécessite pas un modèle. Les vues sont par rapport à la racine de votre application (ils n'ont pas à vivre dans unViews
dossier).Vous devez vous inscrire au service en
Startup.cs
et également vous inscrireHttpContextAccessor
:Exemple d'utilisation:
_Layout.cshtml
et tel ne serait pas utilisé - peut-être unActionContext
est nécessaire, après tout, ceux qui seront chargés? Essayez le service de je lien et voir si cela fonctionne. Il utilise unActionContext
.IHttpContextAccessor
comme un singleton?Dans le passé, j'ai utilisé le
RazorEngine
à l'intérieur d'une Bibliothèque de Classe parce que mon but a été de rendre les modèles à partir de l'intérieur de cette Bibliothèque de Classe.À partir de ma compréhension, vous semblez être à l'intérieur d'un MVC projet 6.0 alors pourquoi ne pas utiliser un
RenderPartialViewToString()
méthode sans avoir à ajouter de la dépendance sur laRazorEngine
?Gardez à l'esprit, je suis le seul à en demander, car je suis curieux.
Pour les fins de l'exemple, de l'intérieur VS2015, j'ai créé un nouveau ASP.NET Application Web et sélectionné le modèle d'Application Web à partir de la ASP.NET 5 Aperçu des Modèles.
À l'intérieur de la
ViewModels
dossier, j'ai créé unPersonViewModel
:Ensuite, j'ai créé un nouveau
BaseController
et ajouté unRenderPartialViewToString()
méthode:De crédit va à @DavidG pour son méthode
À l'intérieur de la
Views-->Shared
dossier, j'ai créé un nouveau Modèles dossier dans lequel j'ai ajouté un simpleRegistrationTemplate.cshtml
Vue fortement typé à monPersonViewModel
comme suit:La dernière étape est de faire de mon
Controller
hériter de monBaseController
Et de créer quelque chose comme:
Bien sûr, l'exemple ci-dessus est inutile, puisque je ne fais rien avec la variable
emailbody
mais l'idée est de montrer comment il est utilisé.À ce point, je pourrais avoir(par exemple), d'invoquer une
EmailService
et passer leemailbody
:Je ne suis pas sûr si c'est la solution qui convienne à votre tâche en cours.
Aujourd'hui, j'ai fini avec ma bibliothèque qui peut résoudre votre problème. Vous pouvez l'utiliser à partir de ASP.NET comme il n'a pas de dépendances sur elle
Exemple:
Plus: https://github.com/toddams/RazorLight
https://github.com/toddams/RazorLight/issues/158
À améliorer @vlince réponse (qui n'était pas en train de travailler hors de la boîte pour moi), voici ce que j'ai fait :
1 - Créer un contrôleur de base que votre autre contrôleur héritera
2 - Hériter du contrôleur de base et l'appel à la méthode
ResolveUrlMethodName
a été supprimé. Donc dans votreCreateHost
ici vous essayez de définir une propriété qui n'existe pas :).Nous avons décidé de déplacer
~/
manipulation de base de Rasoir dans unTagHelper
mis en œuvre dans leMicrosoft.AspNet.Mvc.Razor
de l'assemblée. Voici la s'engager pour les bits qui a supprimé la méthode.J'espère que cela aide.
Méthode d'Extension pour la conversion d'une vue partielle sur la chaîne de réponse.
Utilisation de votre contrôleur actions.
Une solution de rechange à l'aide de seulement ASP.NET de Base, pas de bibliothèques externes, et pas de réflexion peuvent être trouvés ici: https://weblogs.asp.net/ricardoperes/getting-html-for-a-viewresult-in-asp-net-core.
Il faut juste un ViewResult et un HttpContext.