【问题标题】:Dynamic templating based on list of objects基于对象列表的动态模板
【发布时间】:2012-12-09 06:56:04
【问题描述】:

在以下情况下自动生成模板的最佳方法是什么。

对象组:

Article
  |- Id
  |- Text
Gallery
  |- Id
  |- Type
  |- List<Photos>
Video
  |- Id
  |- VideoHash

所有这些对象都位于var list = new List&lt;dynamic&gt;()。所以页面包括:

1. article
2. gallery
3. article
4. video

会有这样的对象:

list.Add(Article)
list.Add(Gallery)
list.Add(Article)
list.Add(Video)

现在我的问题是,为特定对象创建模板然后在生成页面以调用特定模板时,将其与对象数据绑定并作为 .ToString() 发送到浏览器的最佳方法是什么。

是否可以使用 .net 或者我必须使用一些模板库?

更新

为了澄清问题,我在问从动态列表为网站生成 HTML 代码的最佳技术、库、组件是什么。

我的想法是我为文章、视频、画廊创建 HTML 模板,然后我运行页面,它将使用从这个动态列表生成的模板生成整个页面。

【问题讨论】:

  • 你用的是什么框架?
  • 您可以为列表中的每个对象创建一组类吗?
  • 我想我不明白这个问题。您是在问如何从 C#-list 对象创建网页-skeleton,还是要从 C#-lists 创建实际网页?
  • 我想从 c# 列表创建 HTML 代码。 HTML 应该使用模板(用户控件、T4 库)生成,我在模板中定义文章模板、视频、图库的外观。然后它应该全部加入并作为 HTML 返回。很抱歉造成混乱,也许我应该重写整个 q。
  • @feronovak 为什么不使用具有 Razor 模板引擎的 MVC?

标签: c# .net templates object dynamic


【解决方案1】:

动态不是类型安全的,也不提供智能感知。在大多数情况下,您应该避免使用它们。改为创建类层次结构

public class Item
{
    public int Id { get; set; }
}

public class Article : Item
{
    public string Text { get; set; }
}

public class Gallery : Item
{
    public string Type { get; set; }
    public List<Photo> Photos { get; set; }
}

public class Video : Item
{
    public string VideoHash { get; set; }
}

现在您可以创建项目列表

var list = new List<Item>();
lst.Add(new Article { Id = 1, Text = "test" });
lst.Add(new Video { Id = 1, VideoHash = "34Rgw^2426@62#$%" });

类作为对象的模板。派生类继承基类的成员(此处为Id)。


更新

T4 模板可能看起来像这样

<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" language="C#v3.5" debug="true" hostSpecific="true" #>
<#@ output extension=".html" #>
<#@ Assembly Name="System.dll" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly name="mscorlib.dll" #>
<#@ Assembly name="C:\Users\Oli\Documents\Proj\CySoft\StackOverflowTests\StackOverflowTests\bin\Debug\StackOverflowTests.exe" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="StackOverflowTests.CreateHtmlFromClasses" #>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <h1>Example</h1>
    <table style="Width:100%;">
        <# this.AddProperties(new Article { Id = 77, Text = "The quick brown fox." }); #>
    </table>
</body>
</html>
<#+
    private void AddProperties(object obj)
    {
        Type type = obj.GetType();
        var properties = type.GetProperties();#>
        <tr>
            <td>
                <b><#= type.Name #></b>
            </td>
        </tr>
<#+         foreach (PropertyInfo property in properties) {
#>      <tr>
            <td>
                <#= property.Name #>
            </td>
            <td>
                <#= property.GetValue(obj, null).ToString() #>
            </td>
        </tr>
<#+
        }   
    }
#>

这个例子不是一个真实世界的例子,因为它使用了一个对象的值,原因是只在运行时存在。您只会根据类型进行操作。模板引擎无法访问当前项目的类型。因此,您必须将其放在另一个项目中。

【讨论】:

  • 感谢您的提示,您仍然如何使用这样的模板列表?我的意思是,你用什么做模板?用户控制? T4图书馆?将所有这些类作为 HTML 用于浏览器。
  • 是的,您可以使用 T4。 T4 看起来有点乱,因为 HTML 和 C# 代码混合在一起,但它完成了它的工作。
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2018-03-28
  • 2023-03-19
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多