【问题标题】:Generate HTML in ASP.NET Controller在 ASP.NET 控制器中生成 HTML
【发布时间】:2016-04-18 12:12:39
【问题描述】:

我在一个场景中,我有一堆动态对象。它们是使用反射加载的,因此无法将代码添加到能够生成 html 以正确呈现对象的视图中。这应该怎么做? Razor 助手看起来不错,但由于我不知道编译时的对象,所以我不能真正使用这些。

我所做的是创建了一个名为 Person 的基础对象,并在基础类中添加了一个名为 RenderHTML() 的虚拟方法。

public Medic : Person
public Cop : Person

然后,我将在每个将生成 HTML 的类中重写此 RenderHTML 方法,该 HTML 将正确显示子类包含的附加内容。它有效,但使用起来并不容易。当事情变得复杂时,必须使用单个字符串并添加到它会变得非常混乱。

htmlstring += "some more html";

有没有办法设置某种输出缓冲区,我可以在其中执行类似的操作。

string html = startBuffer(){

<html>wdfwjewe</html>

}

括号内的内容可以是纯 HTML,没有任何想转义的内容,所有内容都将保存到 html 字符串中。我正在寻找某种语法突出显示,因为我目前使用的方法正在变得难以使用。

【问题讨论】:

  • 如果 HTML 是“干净的”,您可以使用 XDocument 对象而不是直接使用字符串。
  • 为什么不让 MVC 为您处理视图生成?为每种类型创建一个局部视图,例如~/Views/Shared/DisplayTemplates/Cop.cshtml 然后从您的主视图中引用部分视图并传入您的对象,例如@Html.DisplayFor(Model.PersonObject) 或者,如果您必须在服务器端代码中将部分作为 HTML 字符串,请使用将视图+视图模型呈现为字符串的技术之一。询问您是否需要推荐。

标签: c# html asp.net asp.net-mvc razor


【解决方案1】:

您可以尝试使用TagBuilder() 如果您从&lt;html&gt; 开始构建html,这确实涉及到标签的嵌套。替代方案是StringBuilder()

示例来自documentation

public static string Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
        {
            // Create tag builder
            var builder = new TagBuilder("img");

            // Create valid id
            builder.GenerateId(id);

            // Add attributes
            builder.MergeAttribute("src", url);
            builder.MergeAttribute("alt", alternateText);
            builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

            // Render tag
            return builder.ToString(TagRenderMode.SelfClosing);
        }

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多