我正在使用 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。
- 部分 View (
@Html.Partial
); - 子操作 (
@Html.Action
); - 自定义静态助手(
@Html.Whatever
、@Url.Whatever
、模型的扩展方法等); - 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
文件夹中的限制。
我认为以下问题将使您更多地了解如何在它们之间进行选择:
- Creating reusable HTML view components using Razor in ASP.NET MVC ;
- How to create reusable control in ASP.NET MVC ;
- How to create a reusable piece of HTML with dynamic contents ;
- 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/