2016-08-29 2 views
0

Ich möchte einen Template-Parameter an meine Hilfsmethode für Renderfehler übergeben. Ich habe einige Beispiele gesehen, in denen dies getan wird, aber anscheinend müssen die Variablen in der Vorlage im Geltungsbereich sein, wenn der Helfer aufgerufen wird.MVC Razor: Wie Referenz Helper-Parameter in Razor Markup?

z.B. Expression of HelperResult to format item from a list

Ich hoffe, wie etwas zu tun:

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

Aber ich erhalte die folgenden Compiler-Fehler:

  1. Kann nicht Lambda-Ausdruck umwandeln soll Delegate-Typ, weil einige der Rückgabetypen im Block nicht implicit sind Itly umwandelbar an den Delegaten Rückgabetyp
  2. nicht Lambda-Ausdruck konvertieren kann ‚HelperResult‘ zu geben, weil es nicht eine Art delegieren ist

ich versucht habe, einen Delegierten zu schaffen, sondern es ergibt sich der gleiche Fehler. Ist das möglich? Sollte meine Funktion einen anderen Typ zurückgeben, der als Razor-Text übersetzt/ausgewertet werden kann?

Antwort

1

Um die Beseitigung der Kompilierungsfehlern die rasor dazu bekommen ändern:

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

Die Errortemplate wurde ein Lambda-Ausdruck erwartet, dass HelperResult Vorlage zurückgibt.

+0

Das behebt das Problem, obwohl ich gehofft hatte, es gäbe eine kühlere Lösung, die es mir noch erlauben würde, die Überprüfung der Kompilierungszeit zu nutzen. Ich danke dir sehr! –

0

Nach ungeschickten um ich mit etwas kam ich mochte ein wenig besser (obwohl ich bin sicher, es ist eine saubere Lösung)

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); 
     } 
    } 
    .... 

Das erlaubte mir, in dem Aufruf der Erweiterung meiner beabsichtigten Syntax: