это старый вопрос, но я надеюсь, что ответ поможет кому-то
Что ж, сложно сделать так, чтобы веб-пакет вставлял тег скриптов в ваш index.cshtml, но вы можете включить теги в index.cshtml, например:
@{
ViewData["title"] = "I'am from cshtml";
}
<app-root>Loading...</app-root>
<script type="text/javascript" src="/runtime.js"></script>
<script type="text/javascript" src="/polyfills.js"></script>
<script type="text/javascript" src="/styles.js"></script>
<script type="text/javascript" src="/vendor.js"></script>
<script type="text/javascript" src="/main.js"></script>
тогда вы можете маршрутизировать свой mvc как
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
routes.MapRoute(
name: "spa-fallback",
template: "{*url:regex(^((?!.css|.map|.js|sockjs).)*$)}",
defaults: new { controller = "Home", action = "Index" });
});
. Убедитесь, что все маршруты, которые не соответствуют {controller} {action = Index} / {id?}, Попадают в "spa-fallback ", в котором говорится, что если файл не имеет .css или .map или .js или .sockjs, то он служит вашим домом / индексом.Необходимо, чтобы "regex" для .NET обслуживал файлы сценариев necesarys.
Последний шаг - настройка вашего angular.json для поддержки имени сценариев с помощью outputHashing: все
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"ClientApp": {
...
"architect": {
"build": {
...
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all", //<--add this line
...
},
....
},
"defaultProject": "ClientApp"
}
Наконец, мы можем проверить, является ли URL действительным или нет (иначе любой URL-сервер индексной страницы), который вы можете использовать в файле startup.cs, например,
app.Use(async (context, next) =>
{
string path = context.Request.Path.Value.Substring(1);
bool encontrado = path.EndsWith(".js") || path.EndsWith(".css") || path.EndsWith(".map") || path.StartsWith("sockjs");
if (!encontrado)
{
..use your code to check the url...
}
if (encontrado)
await next.Invoke(); //<--continue
else
{ //send to an error404 page
context.Response.ContentType = "text/html";
await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "error404.html"));
}
});
ПРИМЕЧАНИЕ. Я поместил href скриптов в абсолютное значение.путь, например, src = "/ runtime.js", хорошо в пакете json у нас может быть несколько скриптов, таких как
"scripts": {
"ng": "ng",
"start": "ng serve --base-href=/ --serve-path=/",
"start:fr": "ng serve --base-href=/fr-FR/ --configuration=fr --serve-path=/fr-FR",
"build": "ng build",
...
},
Если мы используем --serve-path = fr-FR, href скрипта должен использоватьэтот путь подачи, например, src = "/ fr-FR / runtime.js"