2017-08-23 1 views
2

Je ne suis pas un grand fan de l'utilisation pré-groupée AddMvc() et préfère utiliser le AddMvcCore() à la place. Cela dit, je me demandais comment utiliser le nouveau (à partir de la version 2.0) AddRazorPages() avec AddMvcCore().ASP.NET Core 2.0 Razor Pages en utilisant AddMvcCore() au lieu de AddMvc()

Par exemple, si nous faisons une configuration "bare-bones" de middleware à utiliser uniquement AddRazorPages() qui se trouve de l'official repository

// loaded the NuGet package Microsoft.AspNetCore.Mvc.RazorPages 
public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvcCore() 
     .AddRazorPages(); 
} 

Après avoir créé une page foo.cshtml et l'a placé dans le répertoire .\Pages\, il retourne un 404 (Page non trouvée) quand je navigue vers l'URL \Foo.

. \ Pages \ Foo.cshtml

@page 
@model IndexModel 
@using Microsoft.AspNetCore.Mvc.RazorPages 

@functions { 
    public class IndexModel : PageModel 
    { 
     public string Message { get; private set; } = "In page model: "; 

     public void OnGet() 
     { 
      Message += $" Server seconds { DateTime.Now.Second.ToString() }"; 
     } 
    } 
} 

<h2>Hello World</h2> 
<p> 
    @Model.Message 
</p> 

La page exemple ci-dessus est tiré de la Microsoft Documents: Introduction to Razor Pages in ASP.NET Core

Quelqu'un at-il compris cela, ou de savoir ce qui manque? Je pense qu'il y a un problème avec le routage.

+0

Je ne pense pas que 'AddMvcCore' ajoute des trucs de rasoir de sorte que vous auriez besoin d'ajouter cela manuellement. – DavidG

+0

Vous voulez dire que j'ai besoin de '.AddRazorViewEngine()' et '.AddViews()', etc? – Svek

+0

Je ne sais pas exactement ce dont RazorPages a besoin (je n'ai pas encore eu l'occasion de jouer avec) mais je commencerais à ajouter des éléments jusqu'à ce que ça fonctionne comme prévu. – DavidG

Répondre

3

Il s'est avéré qu'il y avait deux problèmes.

(1) Je avais besoin pour exécuter le middleware MVC (duh!)

public void Configure(IApplicationBuilder app, ...) 
{ 
    app.UseMvc(); 
} 

(2) Ensuite, je suis une exception levée, ce qui m'a forcé d'avoir à inclure .AddAuthorization()

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvcCore() 
     .AddAuthorization() 
     .AddRazorPages(); 
} 

Ici, il est super-simplifié dans une application console simple:

//using System.IO; 
//using Microsoft.AspNetCore.Builder; 
//using Microsoft.AspNetCore.Hosting; 
//using Microsoft.Extensions.DependencyInjection; 

public static void Main(string[] args) 
{ 
    IWebHost host = new WebHostBuilder() 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .ConfigureServices(services => 
     { 
      services.AddMvcCore() 
       .AddAuthorization() 
       .AddRazorPages(); 
     }) 
     .Configure(app => 
     { 
      //app.UseExceptionHandler("/error"); 
      app.UseStaticFiles(); 
      app.UseMvc(); 
     }) 
     .Build(); 

    host.Run(); 
} 
+0

Si cela a fini par fonctionner, marquez-le comme la réponse. – ssmith

+0

Si je lance mvccore + addrazorpages comme décrit dans cette réponse, j'obtiens toujours l'erreur CS0234: Le type ou le nom de l'espace de noms 'Mvc' n'existe pas dans l'erreur de l'espace de noms 'Microsoft.AspNetCore'. – Zygimantas

+0

@Zygimantas il vous manque des références – Svek

0

Un regard sur le source code for AddMvc, nous pouvons voir qu'il appelle AddMvcCore interne et procède ensuite à ajouter des éléments supplémentaires. Donc, si j'étais vous, je commencerais à ajouter ces éléments jusqu'à ce que vous obteniez des pages Razor, probablement en se concentrant sur les parties de Razor. Par exemple:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvcCore() 
     .AddViews() 
     .AddRazorViewEngine() 
     .AddRazorPages(); 
} 
+0

Cela ne semble rien changer. C'est comme si les routes ne vont pas où elles sont censées ... – Svek

+0

Avez-vous passé au travers et ajouté tous les bits que 'AddMvcCore' n'a pas? – DavidG