簡體   English   中英

如何將lambda傳遞給Razor輔助方法?

[英]How to pass in a lambda to a Razor helper method?

我有一個剃須刀助手方法需要接受一個Func<> ,它將返回一些HTML內容打印出來。 這是我原來的:

@helper node(string title, Func<HelperResult> descriptions)
{
    ....
    <div>@descriptions()</div>
    ....
}

@node("title", 
              new Func<HelperResult>(() => 
              {
                 return new HelperResult(
                     @<text>
                     <span>"desc1"</span>
                     <span>"desc2"</span>
                     </text>);
              }))

不幸的是,我的文字永遠不會打印出來。 也沒有錯誤。

所以我學習了內聯幫助器,並將調用方法更改為:

@node("title",                     
              @<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>)

但是現在我收到編譯錯誤說

“委托'System.Func'不接受1個參數”。

但我並沒有傳遞任何論點。

因此,如果我將其更改為Func<object,HelperResult>然后使用@descriptions(null)調用它,我會收到以下錯誤:

“如果沒有先將lambda表達式轉換為委托或表達式樹類型,則不能將lambda表達式用作動態調度操作的參數”

我確定我在某處出了點問題,但我不確定它到底是什么。

編輯 :我想我可能已經解決了這個問題,但它引入了一些其他問題。

我做的是在傳遞動態方法之前施放lambda。 我猜這就是錯誤試圖說的:

@node("title",                     
              ((Func<dynamic, HelperResult>)(@<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>))

這有效,它可以正確地打印出span標簽。 不幸的是,我必須在調用此Func時傳入一​​個無用的參數。

現在我的問題是我的真正功能不僅僅是寫一些跨度。 它更像是這樣的:

@node("title",                     
              ((Func<dynamic, HelperResult>)(@<text>
              <span>@Helpers.Format(resource.Description,"item")</span>
              </text>))

其中@Helpers.Format是另一個幫助器,資源是頁面模型中的(動態)變量。

當然現在代碼運行但沒有打印出來(在<span>標簽內)。 我在我的Format幫助函數中放了一個斷點,它命中它並且所有參數都被正確設置,所以我不確定它為什么輸出不正確。 同樣,如果我只是將其更改為resource.Description,那么仍然沒有輸出。

由於它在這個上下文之外運行良好,我想知道Razor的內聯助手不能捕獲外部變量嗎?

實際上HelperResult是微軟寧願你沒有使用的東西,正如文檔所證明的那樣:

公共類HelperResult:名稱空間System.Web.WebPages中的IHtmlString

簡介:此類型/成員支持.NET Framework基礎結構,不能直接在您的代碼中使用。

您的問題的一個可能的解決方案可能是將您的描述函數包裝在另一個幫助器中,然后將該幫助器作為方法組傳遞給您的節點幫助器,如下所示:

@helper Node(string title, Func<HelperResult> descriptions)
{
    <div>@descriptions()</div>
}

@helper Description() {
    <span>desc1</span>
    <span>desc2</span>
}

@Node("title", Description)

在任何情況下,你的第一個想法都不應該工作,因為Func類型的參數實際上等於無參數函數,在這種情況下你需要像這樣編寫lambda表達式:

myFunction( () => doSomething)

所以你的函數調用應該是:

@node("title", () =>                    
              @<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>)

由於這些助手的未來有點可疑 ,我會考慮切換到HtmlHelpers用於html的小片段或用於較大塊的Partials

@Test(new Func<object, HelperResult>[]{@<text>hello</text>})

@Test(new Func<object, HelperResult>[]{@<text>hello</text>,@<text>world</text>})


@helper Test(params Func<object, HelperResult>[] results)
{
    foreach (var result in results)   
    {
        @result(null);
    }
}

暫無
暫無

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

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