/ / Użycie lambda do określenia właściwości klasy Helper z częściowego widoku Razor - asp.net-mvc, asp.net-mvc-3, lambda, razor

Używanie lambda do określenia właściwości klasy Helper z widoku części maszynki - asp.net-mvc, asp.net-mvc-3, lambda, brzytwy

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 № 1

Problem 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:

  1. Prześlij dynamikę, która pozwoli kompilatorowi wiedzieć, na co rozwiąże dynamikę

    @ValidationFieldHelper.GetCSSClass(m => Model, (object)@ViewBag.Step)
    
  2. 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 ...