ASP. NET Ядро - обслуживать другой файл HTML для SPA? - PullRequest
1 голос
/ 16 января 2020

Вопрос

Как обслуживать различные HTML (входные) файлы для приложения SPA (Vue) в ASP. NET Core?

Объяснение

В зависимости от условия, я хотел бы обслуживать другую страницу HTML (так же, как контроллер сделал бы для не-SPA). Страница все равно будет содержать точку входа для Vue apps <div id="app">, но некоторые другие изменения должны быть сделаны перед обработкой HTML.

. Я знаю, что мне как-то нужно изменить файл startup.cs, потому что который отображает HTML с app.UseStaticFiles() и app.UseSPAStaticFiles()

Пример

Условие 1 выполнено, base.html подается с client -> public -> base.html

Вместо этого выполняется условие 2 , special.html подается с client -> public -> special.html

Код

Основа c HTML выглядит примерно так:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  <title>Title</title>
</head>

<body>
  <noscript>
    <strong>We're sorry but this webpage doesn't work properly without JavaScript enabled. Please enable it to
      continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->
</body>

</html>

Важные части файла startup.cs выглядят так:

services.AddSpaStaticFiles(configuration =>
{
    configuration.RootPath = "ClientApp/dist";
});

// ....

app.UseStaticFiles();
app.UseSpaStaticFiles();

// ....

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action=Index}/{id?}");

    if (env.IsDevelopment())
    {
        endpoints.MapToVueCliProxy(
            "{*path}",
            new SpaOptions { SourcePath = "ClientApp" },
            npmScript: "serve",
            regex: "Compiled successfully");
    }

    // Add MapRazorPages if the app uses Razor Pages. Since Endpoint Routing includes support for many frameworks, adding Razor Pages is now opt -in.
    endpoints.MapRazorPages();
});

// ....

app.UseSpa(spa =>
{
    spa.Options.SourcePath = "ClientApp";
});

...