【问题标题】:Is this HtmlHelper extension overkill?这个 HtmlHelper 扩展是不是矫枉过正?
【发布时间】:2017-05-03 01:34:49
【问题描述】:

我已经实现了一个自定义 html 帮助程序扩展方法来将部分视图呈现到我的剃须刀页面中,我担心我使用的方法“太重”...

我想在我的网络项目中使用一个通用微调器。我使用的微调器需要许多元素:

<div class="panel-spinner-container">
    <div class="sk-spinner sk-spinner-cube-grid">
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
        <div class="sk-cube"></div>
    </div>
    <div class="panel-spinner-msg"><p>loading...</p></div>
</div>

不是每次我想要一个微调器时都将它包含在剃须刀代码中,我想我会把它扔到一个 html 辅助方法中,所以我可以这样做:

<div>
    @Html.PanelSpinner()
</div>

我为此创建了一个局部视图,其中仅包含上面的 div 和一个 html 辅助扩展方法:

public static MvcHtmlString PanelSpinner(this HtmlHelper html) {

    var controllerContext = html.ViewContext.Controller.ControllerContext;
    var viewData = html.ViewData;
    var tempData = html.ViewContext.TempData;

    using (var stringWriter = new System.IO.StringWriter()) {

        var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, "PanelSpinner");
        var viewContext = new ViewContext(controllerContext, viewResult.View, viewData, tempData, stringWriter);

        viewResult.View.Render(viewContext, stringWriter);
        var stringResult = stringWriter.GetStringBuilder().ToString();

        return new MvcHtmlString(stringResult);
    }
}

这似乎是渲染微调器所需的大量处理。这种方法的性能开销是多少?在这种情况下使用助手是正常的,还是我过度杀戮?有没有更好(性能更高)的方法来做到这一点?

我非常喜欢它的易用性,但我担心性能(例如,我可以只使用@Html.RenderPartial(...),但是我必须记住微调器部分的名称等。辅助方法包装器要容易得多使用)

【问题讨论】:

  • 只使用 css 怎么样?这家伙只用 css 做了微调器tobiasahlin.com/spinkit
  • 您似乎唯一需要“记住”的是“PanelSpinner”。您的扩展方法可能只是public static MvcHtmlString PanelSpinner(this HtmlHelper html) { return html.Partial("PanelSpinner"); }
  • 对我来说看起来不错,这就是在您的页面上呈现一百万其他内容的方式,为什么您的页面会让事情变得糟糕?这不像您的微调器每帧渲染一次......每个微调器都会调用它,我们在这里谈论多少微调器?
  • @Charleh - 我不确定这是否是“一百万其他东西被渲染”的方式,所以不知道这是否会成为问题。我不认为我会在每页上看到超过六个微调器(通常只有一个或两个)。
  • 是的,基本上这是底层机制,但使用部分是有意义的,因为您不必编写样板!

标签: asp.net-mvc html-helper


【解决方案1】:

要使用扩展方法渲染局部视图,您可以使用HtmlHelper 的内置Partial() 方法。可以很简单

public static MvcHtmlString PanelSpinner(this HtmlHelper html)
{
    return html.Partial("PanelSpinner");
}

注意:您需要包含using System.Web.Mvc.Html;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2013-01-10
    • 2012-05-24
    • 2015-03-09
    相关资源
    最近更新 更多