Próbuję napisać EditorTemplate, aby ogólnie zastosować klasy CSS w zależności od logiki dostarczonej przez pomocnika przekazującego model i dodatkowe dane z ViewBag:
@using LSC.DCMP.Web.UI.Helpers
@model String
@ValidationFieldHelper.GetCSSClass(m => Model, @ViewBag.Step)
To pasuje do klasy pomocnika, która obecnie nie jest zaimplementowana, ale ma następującą sygnaturę:
public static class ValidationFieldHelper
{
public static object GetCSSClass(Func<object, string> func, object step)
{
throw new NotImplementedException();
}
}
Podczas próby uruchomienia aplikacji kompilacja kończy się niepowodzeniem z następującym błędem:
„Nie można użyć wyrażenia lambda jako argumentu dla dynamicznie wywoływanej operacji bez uprzedniego rzutowania go na typ drzewa delegatów lub wyrażeń”.
Przeczytałem, że składnia lambda nie jest w pełni obsługiwana przy użyciu szablonów Razor, więc nie jestem pewien, jak mogę zaimplementować tę funkcjonalność.
Odpowiedzi:
4 dla odpowiedzi № 1Problem nie dotyczy lambdy, lecz dynamicznego @ViewBag, którego używasz, co powoduje dynamiczne wysyłanie tej instrukcji, jak wspomniano w komunikacie o błędzie.
Dwie inne opcje tego, co zaoferował Major Byte:
Prześlij dynamikę, która pozwoli kompilatorowi wiedzieć, na co rozwiąże dynamikę
@ValidationFieldHelper.GetCSSClass(m => Model, (object)@ViewBag.Step)
Ustaw dynamikę na zmienną przed użyciem (w zasadzie ta sama oferta jak powyżej)
@{ object vstep = ViewBag.Step; } @ValidationFieldHelper.GetCSSClass(m => Model, vstep)
Oba z nich rzucają dla mnie właściwy wyjątek.
0 dla odpowiedzi nr 2
By
@ValidationFieldHelper.GetCSSClass((Func<object, string>) (m => Model), @ViewBag.Step)
praca dla Ciebie? To nie jest najczystsze rozwiązanie, ale mogę sprawić, że zwróci wyjątek NotImplementedException ...