簡體   English   中英

如何在模板化剃刀代理中包含更多邏輯?

[英]How can I include more logic within a templated razor delegate?

請采用Haacked先生的以下擴展方法。

public static class Helpers {
  public static HelperResult RenderSection(this WebPageBase webPage, 
      string name, Func<dynamic, HelperResult> defaultContents) {
    if (webPage.IsSectionDefined(name)) {
      return webPage.RenderSection(name);
    }
    return defaultContents(null);
  }
}

用法如下:

<footer>
  @this.RenderSection("Footer", @<span>This is the default!</span>)
</footer>

非常方便,但是例如,我想在委托中包含一些業務邏輯,如下所示:

<footer>
  @this.RenderSection("Footer", @<span>
               This @if (condition) {  
                        <label>is the</label> 
                      } else {  
                        <label> default!</label> 
                      } 
              </span>)
</footer>

但是,無論我如何嘗試更改擴展名,在查看頁面時都會出現編譯錯誤。

我該如何實現?

David Fowler讓我了解了Razor的一個非常酷的功能,但我還沒有意識到它已成為1.0,Templated Razor Delegates。 那是什么? 我讓代碼講。

@{
  Func<dynamic, object> b = @<strong>@item</strong>;
}
<span>This sentence is @b("In Bold").</span>

如果您有朋友願意使用粗體標簽而不是強標簽,因為這是“非語義”的,那可能會派上用場。 是的,我用舌頭看着你達米安微笑。 我的意思是,兩個詞都不表示有力嗎? 我離題了。

請注意,生成的委托是Func。 另外,@ item參數是一個特殊的魔術參數。 這些委托僅允許使用一個這樣的參數,但是模板可以根據需要多次調用該參數。

我展示的示例非常簡單。 我知道你在想什么 為什么不使用助手? 給我看一個例子,它真的很有用。 好,知道了!

假設我寫了這個非常酷的HTML幫助器方法來生成任何類型的列表。

public static class RazorExtensions {
    public static HelperResult List<T>(this IEnumerable<T> items, 
      Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            foreach (var item in items) {
                template(item).WriteTo(writer);
            }
        });
    }
}

這個List方法接受模板化的Razor委托,因此我們可以這樣稱呼它。

@{
  var items = new[] { "one", "two", "three" };
}

<ul>
@items.List(@<li>@item)
</ul>

如前所述,請注意,此方法的參數@ <li> @item </ li>會自動轉換為Func <dynamic,HelperResult>,這是我們方法所需要的。

現在,此List方法非常可重用。 讓我們用它來生成漫畫表。

@{
    var comics = new[] { 
        new ComicBook {Title = "Groo", Publisher = "Dark Horse Comics"},
        new ComicBook {Title = "Spiderman", Publisher = "Marvel"}
    };
}

<table>
@comics.List(
  @<tr>
    <td>@item.Title
    <td>@item.Publisher
  </tr>)
</table>

最初實現此功能是為了支持WebGrid助手方法,但是我敢肯定,您會想到其他創造性的方法來利用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM