在ASP.NET核心MVC视图中呈现AngularJs index.html

在ASP.NET核心MVC视图中呈现AngularJs index.html,angularjs,webpack,asp.net-core-mvc,Angularjs,Webpack,Asp.net Core Mvc,我目前正在使用以下技术迁移web应用程序: ASP.NETMVC 安格拉斯 吞咽 Azure云服务 致: ASP.NET核心MVC 安格拉斯 网页包 Azure应用程序服务 迁移的应用程序正确绑定并将AngularJs index.html提供给wwwroot。 目前,我需要向ASP.NET核心MVC应用程序添加两个视图,并向这些视图中插入index.html 我不知道如何: 注入index.html 将其中一个视图作为启动视图 要最终获得URL模式,请执行以下操作: localhost/V

我目前正在使用以下技术迁移web应用程序:

  • ASP.NETMVC
  • 安格拉斯
  • 吞咽
  • Azure云服务
  • 致:

  • ASP.NET核心MVC
  • 安格拉斯
  • 网页包
  • Azure应用程序服务
  • 迁移的应用程序正确绑定并将AngularJs index.html提供给wwwroot。 目前,我需要向ASP.NET核心MVC应用程序添加两个视图,并向这些视图中插入
    index.html

    我不知道如何:

    • 注入index.html
    • 将其中一个视图作为启动视图
    要最终获得URL模式,请执行以下操作:

    localhost/View1/#/angularJs-state 
    

    wwwroot:

    主页:

    public class BaseController : Controller
    {
        public IActionResult Index()
        {
            return View("portal");
        }
    }
    
    第一视图:

     public class PortalController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
    Startup.cs

     app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(name: "portal",
                pattern: "Portal",
                defaults: new { controller = "Portal", action = "Index" });
                endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Base}/{action=Index}/{id?}");
            });
    
    • 第一个视图已正确显示,但在中没有视图名称 url
    • 是否可以在cshtml中呈现wwwroot中的index.html 是否使用@html.Partial查看

    根据您的描述,如果您想在视图中呈现html页面,我建议您可以在mvc中编写一个自定义呈现方法,并将索引文件作为文件结果返回给mvc视图

    更多详细信息,请参考以下代码:

    1.创建渲染扩展方法:

    public static class HtmlHelperViewExtensions
    {
        public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, object parameters = null)
        {
            var controller = (string)helper.ViewContext.RouteData.Values["controller"];
            return RenderAction(helper, action, controller, parameters);
        }
    
        public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, string controller, object parameters = null)
        {
            var area = (string)helper.ViewContext.RouteData.Values["area"];
            return RenderAction(helper, action, controller, area, parameters);
        }
    
        public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
        {
            if (action == null)
                throw new ArgumentNullException(nameof(controller));
            if (controller == null)
                throw new ArgumentNullException(nameof(action));
    
            var task = RenderActionAsync(helper, action, controller, area, parameters);
            return task.Result;
        }
    
        private static async Task<IHtmlContent> RenderActionAsync(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
        {
            // fetching required services for invocation
            var currentHttpContext = helper.ViewContext.HttpContext;
            var httpContextFactory = GetServiceOrFail<IHttpContextFactory>(currentHttpContext);
            var actionInvokerFactory = GetServiceOrFail<IActionInvokerFactory>(currentHttpContext);
            var actionSelector = GetServiceOrFail<IActionDescriptorCollectionProvider>(currentHttpContext);
    
            // creating new action invocation context
            var routeData = new RouteData();
            var routeParams = new RouteValueDictionary(parameters ?? new { });
            var routeValues = new RouteValueDictionary(new { area, controller, action });
            var newHttpContext = httpContextFactory.Create(currentHttpContext.Features);
    
            newHttpContext.Response.Body = new MemoryStream();
    
            foreach (var router in helper.ViewContext.RouteData.Routers)
                routeData.PushState(router, null, null);
    
            routeData.PushState(null, routeValues, null);
            routeData.PushState(null, routeParams, null);
    
            var actionDescriptor = actionSelector.ActionDescriptors.Items.First(i => i.RouteValues["Controller"] == controller && i.RouteValues["Action"] == action);
            var actionContext = new ActionContext(newHttpContext, routeData, actionDescriptor);
    
            // invoke action and retreive the response body
            var invoker = actionInvokerFactory.CreateInvoker(actionContext);
            string content = null;
    
            await invoker.InvokeAsync().ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    content = task.Exception.Message;
                }
                else if (task.IsCompleted)
                {
                    newHttpContext.Response.Body.Position = 0;
                    using (var reader = new StreamReader(newHttpContext.Response.Body))
                        content = reader.ReadToEnd();
                }
            });
    
            return new HtmlString(content);
        }
    
        private static TService GetServiceOrFail<TService>(HttpContext httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException(nameof(httpContext));
    
            var service = httpContext.RequestServices.GetService(typeof(TService));
    
            if (service == null)
                throw new InvalidOperationException($"Could not locate service: {nameof(TService)}");
    
            return (TService)service;
        }
    }
    
    3.在视图中添加以下代码:

    @Html.RenderAction("IndexFile", "Yourcontrollername")
    

    在我看来,最简单的方法是将所有index.html代码复制到默认视图中,而不是在视图中呈现index.html。由于index.html包含整个html格式,而视图也包含此格式。index.html由webpack更新以添加包含捆绑文件的脚本,具体应在何时复制?
        public IActionResult IndexFile()
        {
            return File("index.html", "text/html");
        }
    
    @Html.RenderAction("IndexFile", "Yourcontrollername")