Asp.net-Mvc-3
MVC 3 Razor,具有自定義標記/部分的助手
我什至不確定這是否可能,但我想我會檢查是否有任何方法可以使這更容易。
首先,我的網站中有一些重複的標記,如下所示:
<div class="module"> <h3>Title</h3> <div> <p>Information goes here</p> </div> </div>我想要做的是將它包裝在某種幫助/部分中,以便我可以做這樣的事情
@MyHelper("This is my Title") { <p>Here is my custom markup</p> }
<h3></h3>然後,當它渲染時,它會在 div 和自定義標記之間注入通過參數傳入的標題。自定義標記可以是任何東西,從測試到表單控制項,再到局部視圖。這是可能的嗎?
好吧,這是一種接近它的“標準”方式,使用 HTML 幫助程序擴展。一個非常簡單的版本
Html.BeginForm()。方法:只需返回一個 IDisposable,然後讓
using語句處理其餘的事情。這只是這個概念的一個例子(儘管它有效)。不適合立即重複使用。用很多快捷方式快速編寫,而不是生產程式碼,有很多改進和優化的機會,可能有愚蠢的錯誤,可以使用 TagBuilder 等。可以很容易地修改以重用 Wrapper 類用於不同的……包裝(甚至可能在 ASP.NET MVC 中已經是一個通用的 - 不需要一個)。
public static class WrapHelper { private class Wrapper : IDisposable { private bool disposed; private readonly TextWriter writer; public Wrapper(HtmlHelper html) { this.writer = html.ViewContext.Writer; } public void Dispose() { if (disposed) return; disposed = true; writer.WriteLine(" </div>"); writer.WriteLine("</div>"); } } public static IDisposable Wrap(this HtmlHelper html, string title) { TextWriter writer = html.ViewContext.Writer; writer.WriteLine("<div class=\"module\">"); writer.WriteLine(" <h3>" + html.Encode(title) + "</h3>"); writer.WriteLine(" <div>"); return new Wrapper(html); } }用法:
@using (Html.Wrap("Title")) { <p>My very own markup.</p> }
還有另外一種方式,不用一次性的把戲,也少了一點工作量,非常適合小幫手。
@helper MyHelper(string title, Func<object, object> markup) { <div class="module"> <h3>Title</h3> <div> <p>@markup.DynamicInvoke(this.ViewContext)</p> </div> </div> }這個助手的用法如下所示:
@MyHelper("This is my Title", @<p>Here is my custom markup</p> )或多行:
@MyHelper("This is my Title", @<text> <p>More than one line</p> <p>Of markup</p> </text> )Telerik MVC 控制項使用了這個技巧,例如讓您在文件載入時添加您的 javascript 程式碼。