C# 用于生成小HTML片段的帮助器方法

C# 用于生成小HTML片段的帮助器方法,c#,asp.net-mvc,asp.net-mvc-4,html-helper,C#,Asp.net Mvc,Asp.net Mvc 4,Html Helper,我正在使用ASP.NETMVC将HTML视图与模型分离。然而,有一个具体的情况让我有点困惑 我有几个常用的小信息面板,它们本身由一些较小的信息面板组成。它们从各种模型中包含的子类获取数据,有时是单个实例,有时是对象列表 目前,这是使用局部视图完成的,通过模型参数传递适当的数据,例如: @Html.Partial("UserInfo", this.Model.CurrentUser); @Html.Partial("UserInfo", reply.PostedBy); 等等。这一切都很好 我最

我正在使用ASP.NETMVC将HTML视图与模型分离。然而,有一个具体的情况让我有点困惑

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

目前,这是使用局部视图完成的,通过模型参数传递适当的数据,例如:

@Html.Partial("UserInfo", this.Model.CurrentUser);
@Html.Partial("UserInfo", reply.PostedBy);
等等。这一切都很好

我最近遇到了一个需求,感觉它延伸了这个模型的合理限制,但是-它将涉及大量的局部视图,每个视图中都有少量HTML,嵌套了无数次。页面解析时间似乎开始有点失控,我怀疑搜索和反映部分视图的数量可能与此有关

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

对于最内部的类来说,创建生成并返回所需HTML的静态助手类似乎更有意义——然而,尽管MVC本身使用
HTML
helper类来实现这一点,但感觉这与MVC模式背道而驰

  • 可以使用静态帮助器类生成小的HTML片段吗?
  • 静态
    UserInfo
    类应该去哪里?意见?控制器?其他地方
显然,这种方法仍然将helper方法从模型中分离出来,但是由于它需要一个模型来处理,所以我并不认为它实际上是多么的不耦合

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


请注意:我不是想逃避规则或抱怨!我只想尽可能地“按模式”处理这个问题。如果有大量的局部视图,我会坚持使用,并尽我所能调整性能。

很难说您的最佳路径是基于这里提供的。这在很大程度上取决于你所从事的工作以及你想要实现的目标

例如,您当前通过部分视图包含的用户信息内容,听起来通过子操作更好:

[Authorize]
public class AccountController : Controller
{
    ...

    [ChildActionOnly]
    [AllowAnonymous]
    public ActionResult UserInfo()
    {
        // get your user info here
        return PartialView("UserInfo", userInfo);
    }
}
然后在视图/布局中:

@Html.Action("UserInfo", "Account")
然后,您不需要确保在使用的任何视图模型上都填充了用户对象


接下来,Razor助手方法,如
Html.Partial
等,本身只是
HtmlHelper
UrlHelper
的扩展,用于
Url.
助手。添加自己的扩展方法没有什么错。例如,在将
HtmlHelper
烘焙到MVC5开箱即用之前,使用自定义的
EnumDropDownList for
扩展它是很常见的。然而,扩展实际上最适合于少量的HTML,这似乎是您想要在这里使用的。对于大的HTML块,使用partials更有意义。不过,这两种方法都有效。在很大程度上,您可以决定什么对您的应用程序最有意义。

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

  • 部分视图(
    @Html.Partial
  • 子操作(
    @Html.Action
  • 自定义静态帮助程序(
    @Html.Whatever
    @Url.Whatever
    ,模型的扩展方法等)
  • 剃刀助手。(
    @helper
  • 使用静态帮助器类生成小的HTML片段可以吗

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

    我想说,这两种方法的区别主要在于编码风格和个人偏好。我会使用局部视图将一个大视图分解为可消费的部分,子操作用于应用程序的真正常见和独立的部分(如小部件或登录框),因此我不必用常见的数据填充所有视图模型。对于非常小的html片段(表单中的一个字段),我会使用静态帮助程序或razor帮助程序,对于更多代码,我会使用静态帮助程序,对于更多html,我会使用razor帮助程序

    静态UserInfo类应该去哪里?意见?控制器?其他地方

    从模式的角度来看,这些东西属于视图。如果您询问应该在解决方案中填充哪些文件夹,我建议为它们创建一个特殊文件夹(可能是
    HtmlHelpers
    )。共享剃须刀助手驻留在
    App\u code
    文件夹中可能有限制

    我认为以下问题将为您提供更多关于如何在两者之间进行选择的信息:

  • )
  • )
  • )
  • 更新
    新ASP.NET MVC中可能有第五个解决方案:。据我所知,你可以用它们来代替儿童行为。

    对于回复缓慢表示歉意-太棒了,谢谢你,这正是我所需要的。我现在正在使用所有这些方法,这取决于所需的数据级别、html/代码平衡等,这使得一切都更加整洁。