gpt4 book ai didi

asp.net-mvc - 如何拦截 View 渲染以在所有部分 View 上添加 HTML/JS?

转载 作者:行者123 更新时间:2023-12-02 07:56:22 24 4
gpt4 key购买 nike

我需要从约定驱动的位置编写js文件的内容(如果加载位于~/Views/Home/Home.cshtml的 View ,则类似于~/ClientApp/Controllers/Home/Home.js)。我该怎么做?

示例:如果文件 ~/Views/Home/Home.cshtml 如下所示:

<div id="some-partial-view">
<!-- ... -->
</div>

文件 ~/ClientApp/Controllers/Home/Home.Controller.js 看起来像

function HomeController() {
//some code
}

然后网络服务器返回的渲染 View 应该看起来像(如果使用 fiddler)

<!--ommitted <html> <body> tags -->

<div id="some-partial-view">
<!-- ... -->
</div>

<script type="text/javascript">
function HomeController() {
//some code
}
</script>

一种方法是添加一个 HTML Helper 来执行此操作,例如:

<div id="some-partial-view" ng:Controller="HomeController">
<!-- ... -->
</div>
@Html.IncludeController("HomeController")

但是,我不想在所有部分 View 中重复这一点。

有什么想法吗?

最佳答案

您可以编写自定义 View :

public class MyRazorView : RazorView
{
public MyRazorView(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable<string> viewStartFileExtensions, IViewPageActivator viewPageActivator)
: base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions, viewPageActivator)
{

}

protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
{
base.RenderView(viewContext, writer, instance);

var view = (BuildManagerCompiledView)viewContext.View;
var context = viewContext.HttpContext;
var path = context.Server.MapPath(view.ViewPath);
var viewName = Path.GetFileNameWithoutExtension(path);
var controller = viewContext.RouteData.GetRequiredString("controller");
var js = context.Server.MapPath(
string.Format(
"~/ClientApp/Controllers/{0}/{0}.{1}.js",
viewName,
controller
)
);
if (File.Exists(js))
{
writer.WriteLine(
string.Format(
"<script type=\"text/javascript\">{0}</script>",
File.ReadAllText(js)
)
);
}
}
}

以及一个自定义 View 引擎,当请求部分 View 时,它将返回此自定义 View :

public class MyRazorViewEngine : RazorViewEngine
{
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
return new MyRazorView(
controllerContext,
partialPath,
null,
false,
base.FileExtensions,
base.ViewPageActivator
);
}
}

它将在Application_Start中注册:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MyRazorViewEngine());
}

您可能需要调整一些路径,因为您的问题中不太清楚 js 应该位于哪里,但通常您应该在答案中提供足够的详细信息。

关于asp.net-mvc - 如何拦截 View 渲染以在所有部分 View 上添加 HTML/JS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8642148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com