【问题标题】:Helper methods to generate small HTML snippets生成小 HTML 片段的辅助方法
【发布时间】:2015-02-25 17:00:53
【问题描述】:

我正在使用 ASP.NET MVC 将我的 HTML 视图与我的模型分开。但是有一个具体的情况让我有点困惑。

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

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

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

等等。这一切都很好。

我最近遇到了一个要求,但感觉好像它扩展了这个模型的合理限制——它将涉及大量的局部视图,每个视图中只有少量的 HTML,并且嵌套了很多次。页面解析时间似乎开始有点失控,我怀疑搜索和反映部分视图的数量可能与此有关。

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

对于最内部的人来说,创建静态帮助程序类来生成和返回所需的 HTML 似乎更有意义 - 然而,尽管 MVC 本身使用 Html 帮助程序类来完成它,但感觉就像这违反了 MVC 模式。

  • 可以使用静态帮助类生成小的 HTML sn-ps 吗?
  • 静态UserInfo 类应该去哪里?意见?控制器?其他地方?

显然,这种方法仍然将辅助方法与模型分开,但由于它需要一个模型来处理,我真的看不出它的解耦程度。

静态助手与扩展方法相差甚远,可以userInstance.InfoHtml() 类型的方式使用,这似乎使整个方法与仅将助手方法添加到模型中非常相似。这当然是 MVC 一开始就试图摆脱的!

请注意:我不是想偷偷摸摸地规避规则或抱怨!我只是想尽可能地将其视为“模式”。如果有大量的局部视图,我会尽可能地坚持这一点并调整性能。

【问题讨论】:

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


    【解决方案1】:

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

    1. 部分视图 (@Html.Partial);
    2. 儿童行动 (@Html.Action);
    3. 自定义静态助手(@Html.Whatever、@Url.Whatever、模型的扩展方法等);
    4. 剃须刀助手。 (@helper)

    使用静态帮助类生成小的 HTML sn-ps 可以吗?

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

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

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

    这些东西从模式的角度来看属于View。如果您询问应该在解决方案中填充哪些文件夹,我会为他们推荐一个特殊的文件夹(可能是HtmlHelpers)。 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。据我所知,您可以使用它们而不是子动作。

    【讨论】:

    • 抱歉回复缓慢 - 太棒了,谢谢你,正是我需要的。我现在使用所有这些方法,具体取决于所需的数据级别、html/代码平衡等,这使一切都更加整洁。
    【解决方案2】:

    根据您在此处提供的内容,很难说您的最佳路径是什么。这在很大程度上取决于您正在使用什么以及您想要实现的目标。

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

    [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 的扩展。添加自己的扩展方法并没有错。例如,在开箱即用的 MVC 5 中使用自定义 EnumDropDownListFor 扩展 HtmlHelper 是很常见的。但是,扩展确实最适合少量的 HTML,这似乎是您想要在这里使用的。对于大块的 HTML,使用部分更有意义。不过,两者都有效。很大程度上取决于您决定什么对您的应用程序最有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多