【发布时间】: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 - 我不确定这是否是“一百万其他东西被渲染”的方式,所以不知道这是否会成为问题。我不认为我会在每页上看到超过六个微调器(通常只有一个或两个)。
-
是的,基本上这是底层机制,但使用部分是有意义的,因为您不必编写样板!