2016-08-29 4 views
0

Я хочу передать параметр шаблона моему вспомогательному методу для визуализации ошибок. Я видел несколько примеров, где это сделано, но, похоже, требует, чтобы переменные в шаблоне были в области, когда вызван помощник.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. не может преобразовать лямбда-выражения в предназначенный тип делегата, потому что некоторые типы возврата в блоке не являются имплицитными itly кабриолет к типу возвращаемого делегатом
  2. Не удается преобразовать лямбда-выражения к типу «HelperResult», потому что это не тип делегата

Я попытался создать делегат, но это приводит к одной и той же ошибки. Это возможно? Должен ли мой func вернуть какой-либо другой тип, который может быть скомпилирован/оценен как текст Razor?

ответ

1

Чтобы избавиться от ошибок компиляции изменить RASOR к этому:

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

errorTemplate ожидал лямбда-выражение, которое возвращает HelperResult шаблон.

+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>)