Helper方法生成小型HTML代码段
我正在使用ASP.NET MVC将我的HTML视图与我的模型分开。 然而,有一个特定的情况令我感到困惑。
我有几个常用的小面板信息,它们本身由一些较小的信息板组成。 这些数据来自各种模型中包含的子类,有时是单个实例,有时是对象列表。
目前,这是使用部分视图完成的,通过模型参数传递适当的数据,如下所示:
@Html.Partial("UserInfo", this.Model.CurrentUser); @Html.Partial("UserInfo", reply.PostedBy);
等等。 一切正常。
我最近达到了一个要求,感觉它延伸了这个模型的明显限制 – 但它将涉及非常大量的部分视图,每个部分视图中有少量的HTML,嵌套了很多次。 页面解析时间似乎开始有点失控,我怀疑搜索和反映部分视图的数量可能与它有关。
请注意:我假设重复的HTML应该是相同的仍然是要避免的。 我可以通过在一些更高级别的控件中使用HTML副本来简化嵌套,但是这会让我觉得这会损害可维护性。
对于最内层的人来说,创建生成并返回所需HTML的静态帮助程序类似乎更有意义 – 但是,尽管事实上MVC本身使用Html
帮助程序类,但感觉这与MVC相反图案。
- 是否可以使用静态帮助程序类生成小型HTML代码段?
- 静态
UserInfo
类应该去哪里? 看法? 控制器? 别处?
显然,这种方法仍然将辅助方法与模型分开,但是由于需要使用模型,我并不真正看到它实际上是如何解耦的。
静态助手是一种远离扩展方法的头发宽度,可以在userInstance.InfoHtml()
类型的方式中使用,这似乎使整个方法非常类似于仅将辅助方法添加到模型中。 这当然是MVC首先想要摆脱的!
请注意:我不是想绕过规则或抱怨! 我只想尽可能地将其视为“on pattern”。 如果有很多很多局部视图的话,我会尽我所能坚持这个和性能调整。
我相信有四种常见的解决方案可以在问题中重用html。
- 部分观点(
@Html.Partial
); - 儿童行动(
@Html.Action
); - 自定义静态助手(
@Html.Whatever
,@Url.Whatever
,模型的扩展方法等); - 剃刀助手。 (
@helper
)
是否可以使用静态帮助程序类生成小型HTML代码段?
是否可以使用静态帮助程序类生成小型HTML代码段。 我不喜欢将它们作为方法添加到模型中,扩展方法也行。
我想说这些方法之间的区别主要在于编码风格和个人偏好。 我会使用局部视图来打破耗材碎片的大视图,应用程序的真正常见和独立部分的子操作(如窗口小部件或登录框),所以我不必用我的所有视图模型填充常见事物的数据。 对于非常小的html片段(表单中的字段),我会使用静态帮助器或剃刀助手,其中包含更多代码的静态助手和更多html的剃刀助手。
静态UserInfo类应该去哪里? 看法? 控制器? 别处?
从模式的角度来看,这些东西属于View。 如果你问你应该在解决方案中填充哪些文件夹,我会建议一个特殊的文件夹(也许是HtmlHelpers
)。 共享剃刀助手可能存在限制驻留在App_Code
文件夹中。
我认为以下问题将为您提供更多如何选择它们的方法:
- 使用ASP.NET MVC中的Razor创建可重用的HTML视图组件 ;
- 如何在ASP.NET MVC中创建可重用的控件 ;
- 如何使用动态内容创建可重用的HTML片段 ;
- ASP.NET MVC:Razor @helper vs HtmlHelper的扩展方法 – 哪个更受欢迎? 。
UPDATE
新的ASP.NET MVC中可能有第五个解决方案: View Components 。 据我所知,你可以使用它们而不是儿童行动。
根据您在此处提供的内容,很难说出您的最佳途径。 很大程度上取决于你正在做什么以及你想要达到的目标。
例如,您当前通过部分视图包含的用户信息内容听起来像是通过子操作更好地服务:
[Authorize] public class AccountController : Controller { ... [ChildActionOnly] [AllowAnonymous] public ActionResult UserInfo() { // get your user info here return PartialView("UserInfo", userInfo); } }
然后在你的视图/布局中:
@Html.Action("UserInfo", "Account")
然后,您不需要确保在您正在使用的任何视图模型上填充了用户对象。
接下来,像Html.Partial
等Razor辅助方法本身只是对Url.*
帮助程序的HtmlHelper
或UrlHelper
扩展。 添加自己的扩展方法没有错。 例如,在将HtmlHelper
放入MVC 5开箱即用之前,使用自定义EnumDropDownListFor
扩展HtmlHelper
是很常见的。 但是,扩展实际上最适合于少量的HTML,这似乎是你想要在这里使用的。 对于大块的HTML,使用partials更有意义。 但要么有效。 在很大程度上取决于您只需决定哪些内容对您的应用程序最有意义。
- 使用Castle Windsor将依赖项注入CustomAttribute
- Button Group of Radio Buttons没有设置任何带Bootstrap 3的活动按钮
- Unity DI自定义汇编的自动注册
- entity framework:路径中的非法字符。 (连接字符串)(MVC3)
- 模型绑定是否通过asp.net mvc中的查询字符串工作
- WebActivator PreApplicationStartMethod不起作用
- 如何启用迁移以在MVC4中更新我的数据库?
- 在我的视图中复选框中带有mvc渲染的枚举,我的控制器的反应?
- @ Html.ValueFor(x => x.PropertyName)和@ Model.PropertyName之间的区别是什么?