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

Odpowiedz Nowy wątek
2018-11-28 18:14
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!

edytowany 1x, ostatnio: dawid75_75, 2018-11-28 18:14

Pozostało 580 znaków

2018-11-28 18:27
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

edytowany 7x, ostatnio: WeiXiao, 2018-11-28 18:32

Pozostało 580 znaków

2018-11-28 18:48
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..

edytowany 1x, ostatnio: dawid75_75, 2018-11-28 18:49
Za T i U podstawiasz swoje typy, na których chcesz operować :P - WeiXiao 2018-11-28 19:13

Pozostało 580 znaków

2018-11-28 19:18
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.

edytowany 1x, ostatnio: dawid75_75, 2018-11-28 19:22

Pozostało 580 znaków

2018-11-28 19:27
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ś }
edytowany 2x, ostatnio: WeiXiao, 2018-11-28 19:27

Pozostało 580 znaków

2018-11-28 19:40
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?

Pozostało 580 znaków

2018-11-28 19:44
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

edytowany 1x, ostatnio: WeiXiao, 2018-11-28 19:55
Ogólnie to tak, chciałem zrobić kolekcję dla różnych typów. - dawid75_75 2018-11-28 21:39

Pozostało 580 znaków

2018-11-28 21:38
0

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

Pozostało 580 znaków

2018-11-29 16:54
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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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