【问题标题】:Render Razor View to string in ASP.NET Core ignores the ASP attributes在 ASP.NET Core 中将 Razor 视图渲染为字符串会忽略 ASP 属性
【发布时间】:2016-06-09 12:49:27
【问题描述】:

当我以通常的方式运行 MVC 请求时,淹没在 HTML 标记中的 ASP 属性被正确解释。

例如

这就是我的观点,

        <ul class="nav navbar-nav">
            <li><a asp-controller="Home" asp-action="Index">Home</a></li>
            <li><a asp-controller="Home" asp-action="About">About</a></li>
            <li><a asp-controller="Home" asp-action="Contact">Contact</a></li>
        </ul>

当涉及到浏览器时,这就是它的翻译,

<ul class="nav navbar-nav">
      <li><a href="Home/Index">Home</a></li>
      <li><a href="/Home/About">About</a></li>
      <li><a href="/Home/Contact">Contact</a></li>
</ul>

现在,如果我通过以下函数渲染视图,

    public string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ActionContext.ActionDescriptor.Name;

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            var engine = Resolver.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
            ViewEngineResult viewResult = engine.FindPartialView(ActionContext, viewName);

            ViewContext viewContext = new ViewContext(ActionContext, viewResult.View, 
            ViewData, TempData, sw, new HtmlHelperOptions());

            var t = viewResult.View.RenderAsync(viewContext);
            t.Wait();

            return sw.GetStringBuilder().ToString();
        }
    }

隐藏在锚标记中的属性保持原样,看起来它们根本不被视图引擎解释。

            <ul class="nav navbar-nav">
                <li><a asp-controller="Home" asp-action="Index">Home</a></li>
                <li><a asp-controller="Home" asp-action="About">About</a></li>
                <li><a asp-controller="Home" asp-action="Contact">Contact</a></li>
            </ul>

【问题讨论】:

  • 我想这是因为这些是标签助手,而不是 Razor。
  • 嗨,大卫,是的,这是真的,但让它们发挥作用的解决方案是什么。我想检索视图中所有内容的扁平化 HTML,包括剃刀和标签助手。

标签: asp.net-mvc asp.net-mvc-4 razor asp.net-core asp.net-core-mvc


【解决方案1】:

我尝试了您的 RenderPartialViewToString 代码,一切正常。我猜当您使用RenderPartialViewToString 时,您将视图放在标准View 文件夹之外。所以请尝试下一个代码

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"   

<ul class="nav navbar-nav">
    <li><a asp-controller="Home" asp-action="Index">Home</a></li>
    <li><a asp-controller="Home" asp-action="About">About</a></li>
    <li><a asp-controller="Home" asp-action="Contact">Contact</a></li>
</ul>

因此,如果我是对的并且之后一切正常,您可以尝试将 _ViewImports.cshtml 文件添加到该文件夹​​并在那里写入 @addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers",以便该文件夹或子文件夹中的所有视图都将应用相同的逻辑

【讨论】:

  • 您好 YuriyP,感谢您的意见。我在标准 Views 目录下有一个视图,它进一步调用 2 个视图组件,其 cshtml 是 Views/Shared/Components/ 目录的一部分。上述超链接是视图组件的 cshtml 之一。当我添加标签助手时,它给了我空的href,即
  • Home
  • 核心为那些在路由表中不存在的控制器/动作生成空的href。所以请仔细检查你的 HomeController 中是否真的有公共索引方法。如果您使用区域也可能是一个问题(因此在这种情况下应该指定它)。此外,如果您使用的是标准路由配置,那么您可以收到类似 &lt;a href="/"&gt;Home&lt;/a&gt; 的信息,这是正确的结果,因为 Home 是默认控制器,而 Index 是默认操作。
  • 你是对的!!我有视图的地方和 renderview 方法主要通过 web api 公开 HTML。使用 web api 的客户端网站具有带有操作方法的 HomeController。作为一种解决方案,我需要在 web api 项目中创建路线图,以及使用虚拟操作方法的 HomeController。现在它工作正常。非常感谢您提供正确方向的指导。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签