2016-12-17 61 views
0

我已经实现了自定义html助手扩展方法来呈现我的剃须刀页面的局部视图,我担心我使用的方法是“太重”...这是HtmlHelper扩展过度杀伤力?

我想使用在我的web项目中常见的微调。我使用的微调需要许多元素:

<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); 
    } 
} 

这似乎是非常多的处理REQ的用于呈现微调。这种方法的性能开销是多少?对这种场景使用助手是否正常?还是我过度使用这种场景?有没有更好的(更高性能)的方式来做到这一点?

我非常喜欢易用性,但担心性能问题(例如,我只能使用@Html.RenderPartial(...),但后来我必须记住spinner partial的名称等等。辅助方法包装器更容易使用)

+0

怎么样只用CSS? 这家伙只用css制作纺纱人http://tobiasahlin.com/spinkit/ –

+0

你需要'记住'的唯一东西是“PanelSpinner”。你的扩展方法可以简单地为'public static MvcHtmlString PanelSpinner(this HtmlHelper html){return html.Partial(“PanelSpinner”); }' –

+0

对我来说看起来很好,这就是你的页面上呈现了一百万个其他的东西,为什么你的东西会南下呢?这不像是你的微调器每帧渲染一次......你给每个微调器打个电话,我们在这里谈论多少个微调器? – Charleh

回答

2

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

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

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