c# - 生成小型 HTML 片段的辅助方法

标签 c# asp.net-mvc asp.net-mvc-4 html-helper

我正在使用 ASP.NET MVC 将 HTML View 与模型分开。然而,有一个具体情况让我有点困惑。

我有几个常用的小信息面板,它们本身是由许多较小的信息面板组成的。它们从各种模型中包含的子类获取数据,有时是单个实例,有时是对象列表。

目前,这是使用部分 View 完成的,通过模型参数传递适当的数据,如下所示:

@Html.Partial("UserInfo", this.Model.CurrentUser);
@Html.Partial("UserInfo", reply.PostedBy);

等等。这一切都运行良好。

我最近遇到了一个要求,感觉它超出了该模型的合理限制 - 它将涉及大量的部分 View ,每个 View 中只有少量的 HTML,嵌套了很多次。页面解析时间似乎开始变得有点失控,我怀疑搜索和反射(reflect)部分 View 的数量可能与此有关。

请注意:我假设仍然要避免重复本应相同的 HTML。我可以通过在一些更高级别的控件中保留 HTML 副本来简化嵌套,但我发现这会损害可维护性。

对于最内部的,创建静态帮助器类来生成并返回所需的 HTML 对我来说似乎更有意义 - 然而,尽管 MVC 本身使用 Html 帮助器来完成它class,感觉这违背了MVC模式。

  • 可以使用静态帮助器类生成小型 HTML 片段吗?
  • 静态UserInfo 类应该放在哪里?意见? Controller ?其他地方?

显然,这种方法仍然将辅助方法与模型分开,但由于它需要一个模型来使用,所以我并没有真正看到它到底有多么分离。

静态助手与扩展方法相差甚远,可以以 userInstance.InfoHtml() 类型的方式使用,这似乎使整个方法与仅添加助手非常相似方法到模型。这当然是 MVC 首先想要摆脱的!

请注意:我并不是想规避规则或提示!我只是想尽可能“按模式”处理这个问题。如果需要大量的局部 View ,我会坚持下去并尽我所能调整性能。

最佳答案

我相信有四种常见的解决方案可以根据您在问题中的需要重用 html。

  1. 部分 View (@Html.Partial);
  2. 子操作 (@Html.Action);
  3. 自定义静态助手(@Html.Whatever@Url.Whatever、模型的扩展方法等);
  4. Razor 助手。 (@helper)

Is it OK to use static helper classes to generate small HTML snippets?

使用静态帮助器类来生成小的 HTML 片段绝对可以吗?我不喜欢将它们作为方法添加到模型中的想法,扩展方法就可以了。

我想说这些方法之间的差异主要在于编码风格和个人喜好。我会使用部分 View 只是将大 View 分解为可使用的部分,应用程序的真正常见和独立部分(如小部件或登录框)的子操作,因此我不必使用以下内容填充我的所有 View 模型常见事物的数据。我会使用静态帮助器或 Razor 帮助器来处理非常小的 html 片段(表单中的字段),使用静态帮助器来获取更多代码,使用 Razor 帮助器来获取更多 html。

Where should the static UserInfo class go? Views? Controllers? Elsewhere?

这些东西从模式角度来说属于View。如果您询问应该在解决方案中填充哪些文件夹,我会为它们推荐一个特殊的文件夹(可能是 HtmlHelpers)。共享 Razor 助手可能存在驻留在 App_Code 文件夹中的限制。

我认为以下问题将使您更多地了解如何在它们之间进行选择:

  1. Creating reusable HTML view components using Razor in ASP.NET MVC ;
  2. How to create reusable control in ASP.NET MVC ;
  3. How to create a reusable piece of HTML with dynamic contents ;
  4. ASP.NET MVC: Razor @helper vs extension methods to HtmlHelper - which is preferred? .

更新

新的 ASP.NET MVC 中可能有第五种解决方案: View Components 。据我所知,您可以使用它们来代替子操作。

关于c# - 生成小型 HTML 片段的辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28725037/

相关文章:

c# - Razor 引擎库在 azure 函数上引发错误

c# - Linux 上的 Mono WebBrowser 控件

c# - 如果我在 C# 中重载添加和删除,为什么我不能引发或调用事件

c# - 对具有多个提交的表单进行建模和验证

javascript - 获取点击事件的绑定(bind)数据

c# - 使用 JQUERY ajax 函数将 JSON 对象发送到 ASP.NET Web 服务

c# - Entity Framework : One to zero relationship

asp.net - 在 ASP.NET MVC View 中渲染 HTML 文件?

c# - 在 MVC Razor 中访问 WCF 服务

asp.net - 之前必须调用 "WebSecurity.InitializeDatabaseConnection"方法吗?