Asp.net-Mvc-3

MVC 3 Razor,具有自定義標記/部分的助手

  • December 10, 2012

我什至不確定這是否可能,但我想我會檢查是否有任何方法可以使這更容易。

首先,我的網站中有一些重複的標記,如下所示:

<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 程式碼。

這也是一個很好的例子這裡也有一些資訊。

引用自:https://stackoverflow.com/questions/9087792