Wyrażenia lambda przekazywane, C# .NET MVC.

0

Drodzy Koledzy,

mam drobny problem ze składnią. Mianowicie, mam funkcję o sygnaturze:

public static HtmlString RegistryCryteriaGroupFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, int colCount,
            params Expression<Func<TModel, TValue>>[] expressionList);

Chciałbym wywołać sobie tę funkcję w widoku, mam zadeklarowany @model. Problem może błahy, ale nie mogę ułożyć tablicy z wyrażeń lamda dla modelu. W jaki sposób powinno to poprawnie wyglądać?

@Html.RegistryCryteriaGroupFor(2, m=>m.prop1, m=>m.prop2)

nie wchodzi.

Z góry dziękuję za wskazówki i pozdrawiam!

0

Dlaczego na widoku?

Dlaczego nie samo Func?

Dlaczego expression list, a jest params[]?

public static void Function(List<Expression<Func<T, U>>> expressionList)
{

}

Przykład przekazania

Function
(
    new List<Expression<Func<T, U>>>
    { x => x.prop1 coś, x => x.prop2 coś }
);

A jeżeli chcesz sprawdzić czy spełnia każdy warunek z tej listy to może trzeba to poskładać w jeden warunek, albo zrobić .All

0
  1. Na widoku, bo funkcja z założenia ma być uniwersalna i chcę ją zastosować do różnych modeli w różnych widokach do wyświetlania róznych parametrów..
  2. Prawdę mówiąc nie bardzo widzę inną możliwość jeśli dalej w ciele funkcj iużywam EditorFor i przekazuję expression. Jeśli jest lepsza to chętnie zobaczę.
  3. Nazwa jest robocza, a chciałem params, bo to klasyczne podejście jeśli nie znam liczby przekazywanych parametrów.

Nie mogę wywołać tej funkcji na widoku w taki sposób jak podajesz, podkreśla moje odpowiedniki T i U na czerwono. Błąd CS0246, nie rozpoznaje nazwy T i U..

0

Rzeczywiście, jak podałem typy wprost to przeszło :D Tylko nie do końca o to mi chodzi. Chciałbym to zrobić generycznie aby podać wiele lambd o różnych typach - bo różne typy mam w modelu. Chciałbym tak napisać sygnaturę funkcji aby wywołanie było podobne do tego:

@Html.RegistryCryteriaGroupFor(2, m=>m.prop1, m=>m.prop2)

Sygnatura, którą podałem w pierwszym poście:

public static HtmlString RegistryCryteriaGroupFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, int colCount,
            params Expression<Func<TModel, TValue>>[] expressionList);

jest składniowo poprawna, nie wiem jednak w jaki sposób prawidłowo podać do niej parametry.

0

@dawid75_75:

Nie twierdzę, że była niepoprawna, ale na liście chyba wygodniej :P

A tak?

new Expression<Func<TModel, TValue>>[] { x => x.prop1 coś, x => x.prop2 coś }
0

Tak, przeszło dla paramsów i nawet wygenerowało to co chciałem, ale za TValue musiałem podać object, co mnie trochę boli :P Czemu muszę tak robić, skoro moja metoda jest generyczna?

0

@dawid75_75:

Jest generyczna, ale czy Ty chcesz chyba zrobić kolekcje dla wielu typów RÓŻNYCH tak?
np.

Expression<Func<A, B>>

i

Expression<Func<C, D>>

w 1 kolekcji?

Nie polecam, ale może params dynamic[]? lub ogólnie może twój koncept jest niekoniecznie najlepszy :P

0

Rzeczywiście to był słaby pomysł. Rzuciło wyjątkiem przy wywołaniu EditorForModel.

0

Jak dla mnie, to skoro potrzebujesz takich kombinacji, to znaczy, że za dużo logiki upychasz w widoku. Cokolwiek robisz powinieneś to robić w kontrolerach albo jeszcze gdzieś niżej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1