在ASP.NET核心MVC视图中呈现AngularJs index.html
我目前正在使用以下技术迁移web应用程序:在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
index.html
我不知道如何:
- 注入index.html
- 将其中一个视图作为启动视图
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查看
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")