2016-08-29 69 views
0

我想將模板參數傳遞給我的幫助器方法來呈現錯誤。我已經看到了幾個這樣做的例子,但似乎要求在調用helper時模板中的變量在範圍內。MVC Razor:如何引用Razor標記中的幫助參數?

例如Expression of HelperResult to format item from a list

我希望做一些事情,如:

public static MvcHtmlString ErrorBlock<TModel>(this HtmlHelper helper, TModel model, string @class = null, object context = null, string view = null, object attributes = null, Func<ErrorModel,HelperResult> errorTemplate = null) 
     where TModel : ErrorModel 

...

@ShopMR.ErrorBlock(Model, errorTemplate: r => @<div>@r.Message</div>) 

但我得到以下編譯器錯誤:

  1. 不能lambda表達式轉換爲預期委託類型,因爲 塊中的某些返回類型不是隱含的itly敞篷 爲委託返回類型
  2. 無法轉換lambda表達式鍵入「HelperResult」,因爲它不是一個委託類型

我試圖創建一個代表,但它導致了同樣的錯誤。這可能嗎?我的func是否應該返回可以編譯/評估爲Razor文本的其他類型?

回答

1

爲了擺脫編譯錯誤的改變rasor這樣:

@ShopMR.ErrorBlock(Model, errorTemplate:r => new HelperResult(x => { x.WriteLine($"<div>r.Message</div>"); }) 

的errorTemplate期待返回HelperResult模板lambda表達式。

+0

解決了這個問題,雖然我希望有一個更酷的解決方案,仍然可以讓我利用編譯時檢查。非常感謝! –

0

浮躁的周圍後,我想出了我喜歡更好一點(雖然我肯定有一個清潔的解決方案)

public static MvcHtmlString ErrorBlock<TModel>(this HtmlHelper helper, TModel model, 
     string @class = null, object context = null, string view = null, object attributes = null, 
     Func<ErrorModel, Func<ErrorModel,IHtmlString>> errorTemplate = null) 
     where TModel : BaseModel 
    { 
    ... 
     if (errorTemplate != null) 
     { 
      var formattedErrors = errors.Select(e => errorTemplate?.Invoke(e)?.Invoke(e)?.ToHtmlString() ?? string.Empty); 
      tb.InnerHtml = string.Join("", formattedErrors); 
     } 
    } 
    .... 

這讓我用我的預期語法調用擴展:

@ShopMR.ErrorBlock(Model, errorTemplate: r => @<div>@r.Message</div>)