【问题标题】:ASP.NET MVC 3 Reusable Table Display Template with Razor带有 Razor 的 ASP.NET MVC 3 可重用表格显示模板
【发布时间】:2016-10-04 05:08:14
【问题描述】:

有没有在 ASP.NET MVC3 中使用新的 Razor 语法创建表格显示模板的好方法?

在 ASP.NET MVC 2 中,Phil Haack 正在写关于 tabular display templates 的博客。 ASP.NET MVC3 中是否有更好的方法?

编辑:

是否也可以根据模型元数据来渲染网格?因此,我不想使用 WebGrid API 而是使用 模型元数据 手动定义列。我看到的问题是您每次都必须使用 WebGrid API 手动定义表格。我希望有可能拥有一种可重复使用的表格!

编辑: 那么使用模型元数据创建网格有什么好的做法吗?

【问题讨论】:

  • 看看 Telerik 的开源 MVC 网格,sourcedemo
  • 是否允许在商业非开源项目中使用网格:)?
  • "如果您使用 Telerik Extensions for ASP.NET MVC Open Source GPL,您有义务遵循 GPL v2.0 中规定的再分发权利。如果您购买了 Telerik Extensions for ASP .NET MVC 商业许可证,您可以将 Telerik 产品作为应用程序的一部分重新分发,而无需共享应用程序的源代码。查看许可条款。” telerik.com/purchase/faqs/aspnet-mvc.aspx
  • 好的,所以这对我来说是没有选择的。

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


【解决方案1】:

您可以在 MVC3 中使用新的 WebGrid:

@{
    var grid = new WebGrid(Model);
    @grid.GetHtml();
}

您可以使用 jQuery 标签:http://jqueryui.com/demos/tabs,创建标签页。

对不起,如果我误解了你的问题。

【讨论】:

【解决方案2】:

我用的不多,但据我了解,您必须先设置 MVC 3 的 WebGrid,然后才能使用它。而且您不想在视图中设置表格,而是使用模型属性来设置。

如果我在哪里做,我会做以下事情:

  • 创建我的自定义属性,我将使用这些属性来装饰我的模型,以定义哪些属性是列、哪些标签将用于列标题以及您要配置的任何其他内容。

  • 我将创建一个带有静态方法的静态类,该方法接收您的模型实例,使用反射来读取属性和您的自定义属性,然后它会从那里吐出 WebGrid 供您在视图中使用。

这就是方法,但我会告诉你我为什么不这样做:在 MVC 中,你装饰你的模型以进行验证等事情,这很棒而且是声明性的。但是当你定义一个网格时,这是一个非常特定于视图的东西。当然,您可能正在使用特定于视图的 ViewModel,但我认为表格布局配置不属于模型。 WebGrid 或 Telerik 的 Grid 在它工作之前的方式已经很好地声明了。

WebGrid 和 Telerik 的 Grid 已经在使用最佳实践,通过提供声明性、流畅的接口来定义表结构和行为。每个表都不同,因此定义每个表是有意义的。您说的是“手动”,但情况远非如此,因为网格正在为您完成所有肮脏的工作,您只是告诉它您想要什么(声明式编程)。

【讨论】:

  • 使用模型元数据对我来说似乎弊大于利。例如,当您必须支持国际化(多种语言)时,使用该属性来显示文本是很难看的。
  • @Rookian:使用文本属性进行本地化并不难看。遗憾的是,对于 MVC 3 之前的版本,您必须通过从 DisplayAttribute 继承并从资源文件中获取字符串来指定自己的数据属性实现(我将资源类型和资源键作为参数传递)。这样写一次需要10分钟,可以重复使用。幸运的是,这在 MVC 3 中得到了解决,支持 DisplayAttribute(resourceKey, resourceType) 重载,由于 MVC 2 版本和模型装饰属性之间的日期冲突而被忽略。
【解决方案3】:

你可以看看new WebGrid helper

【讨论】:

【解决方案4】:

你也可以考虑使用telerik grid和tabstrip MVC组件,查看their demos

【讨论】:

    【解决方案5】:

    我非常喜欢jQuery templates。您只需要传递 JSON 对象,它就会完成其余的工作。适合排序、分页等。

    【讨论】:

      【解决方案6】:

      Phil Haack 写了一篇关于模板化 Razor 代表的非常酷的博客文章。他写的html助手,简单轻量。

      http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx

      【讨论】:

        【解决方案7】:

        刚刚找到这个答案,正在寻找类似的解决方案。不过,我也希望有一些可重用的东西,所以最终根据卡尔曼的回答创建了一个简单的模板,它看起来像这样:

        查看/DisplayTemplates/Table.cshtml

        @model IEnumerable<object>
        @{WebGrid grid = new WebGrid(Model);}
        @grid.GetHtml()
        

        用法

        @Html.DisplayForModel("Table")
        

        通过将[DataType("Table")] 添加到属性,这也应该适用于集合的模型元数据。

        【讨论】:

        • 这被证明是一个相当蹩脚的解决方案。 Webgrid 不支持数据注释,这使得它非常有限。我会把它留在这里,以防它对其他人有用
        猜你喜欢
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 2012-06-05
        • 2011-12-18
        • 2013-12-10
        • 1970-01-01
        相关资源
        最近更新 更多