gpt4 book ai didi

asp.net-mvc - 将服务器端包含转换为 Razor

转载 作者:行者123 更新时间:2023-12-04 17:47:24 26 4
gpt4 key购买 nike

我正在将 ASP.NET webforms 应用程序升级/修改到 MVC5 - 理想情况下,到 Razor 引擎(以允许自动移动布局页面切换,并利用 MVC 功能)。

我们有数百个服务器端包含,都命名为 *.inc。绝对的他们。应用程序太大了,我们将不得不逐页转换页面 - 没有办法一次全部完成。 (为了了解这个项目有多大以及它存在多长时间,我们迁移到 TFS 时 VSS 中的整个源代码控制历史大约为 10GB。这包括大量媒体文件,但仍然如此。它很大,而且不会离开。)

有什么方法可以将这些 #!include 调用转换为 RenderPartial() 或 RenderAction() 调用,而无需将每个文件重命名为 .cshtml?

复制包含文件是一个糟糕的建议,因为这会破坏 DRY。

理想情况下,我想要一个处理此问题的部分 View - 我想它会将文件名作为参数,并且是单行的,因此我可以训练每个人轻松地转换这些。

我还想要某种文件级缓存。只是从磁盘加载输出并将其转储到输出流中对于小型站点来说是很好的......但这不是一个小型站点。

我们有一个 ascx 文件,现在可以为其中的许多包含进行缓存 - 但我不知道如何在 Razor 中编写相应的文件。

编辑 1:这些大部分是非代码包含的,但我确信用户控件定义已经隐藏在一些中。我必须重写那些,所以假设答案是“这些是纯 html,没有代码”

编辑 2:我们有嵌套包含文件的情况(我发誓不是我)。包含文件可以包含其他文件。我有一个缓存 ASCX 控件可以递归地处理这个问题,所以这是移植代码的问题。

编辑 3:任何潜在的解决方案也必须在布局 cshtml 文件中工作。我们已经包含在现有的母版页中。

最佳答案

在我的脑海里,我可以想到大约 4 种方法来解决这个问题。

注意:我对缓存机制并没有太在意,因为这是超出这个问题的设计决定。

创建一个 Controller / Action 来为你呈现包含:

public class IncludeController : Controller
{
// GET: Render
public ActionResult Render(string path)
{
return new IncludeResult(path);
}
}

public class IncludeResult : ActionResult
{
private string _path { get; set; }

public IncludeResult(string path)
{
_path = path;
}
public override void ExecuteResult(ControllerContext context)
{
// possibly check the cache here, or let MVC handle cache at the action level
// get the contents of the include file output to the response
context.HttpContext.Response.Write(File.OpenRead(_path));
}
}

在 View 中
@Html.Action("Render", "Include", new {path = "~/Includes/test.inc"})

注意:尝试为此使用 FilePathResult 并且它似乎返回奇数字符,因此自定义 IncludeResult
创建一个 HtmlHelper 扩展:
public static class HtmlExtension
{
public static MvcHtmlString RenderInclude(this HtmlHelper helper, string path)
{
// check the cache
string output = File.ReadAllText(path);
return new MvcHtmlString(output);
}
}

在 View 中
@Html.RenderInclude("~/includes/test.inc")

我认为此选项适合您尝试做的最好的事情,但是从最纯粹的方法来看,这可能不适合“MVC 做事的方式”

扩展 RazorViewEngine 以查找包含文件:

我没有深入探讨这个问题,对于您想要实现的目标来说可能有点矫枉过正,但以下博客有一些代码示例可以帮助您: http://weblogs.asp.net/imranbaloch/view-engine-with-dynamic-view-location

然后你可以使用标准 Html.Partial在您的 View 中编写代码
@Html.Patial("~/includes/test.inc");

在 View 模型的属性中公开包含内容:

这似乎是最麻烦的,但它仍然是一种选择。
public class ViewModel
{
public MvcHtmlString IncludeContents { get; set; }
....

private GetIncludeContent(string path)
{
IncludeContents = new MvcHtmlString(File.ReadAllText(path));
}
}

然后在 View 中
@model.IncludeContents

关于asp.net-mvc - 将服务器端包含转换为 Razor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29547287/

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