Przekazywanie parametru z widoku do akcji.

Odpowiedz Nowy wątek
2018-12-29 22:27
0

Cześć!

Mój problem polega na przekazaniu w RouteValues danych z widoku do akcji. Sprawa wygląda tak, że muszę parsować enuma i wynik parsowania chciałbym przekazać sobie do akcji. Enuma mam zapisanego w TempData. Wobec tego, wyciągam sobie na początku widoku tego enuma z TempData i od razu parsuję na właściwy typ. Wygląda to standardowo:

    var typEnum = TempData["klucz"] as MyEnumType?;

W widoku mam tak tworzone hiperłącze na moim przycisku:

Url.Action("Akcja", "Kontroler", new{TypEnum = typEnum})

Debugowałem step-by-step i wynik parsowania jest prawidłowy, typEnum jest określony jako MyEnumType i ma wartość taką, jaką zapisywałem wcześniej w kontrolerze. Zapisywałem tak:

TempData["klucz"] = zapisywanyTypEnum;

Mimo zdawałoby się prawidłowych wyników parsowania do akcji za każdym razem leci null. Jeśli jednak na widoku określę typEnum tak:

var typEnum = MyEnumType.Etykieta1;

To wtedy do akcji jest przekazywane prawidłowo. Nie mam zielonego pojęcia dlaczego kiedy parsuję to wysyłany jest null, a kiedy podaję na sztywno to samo to wtedy jest dobrze.

Będę wdzięczny i z góry dziękuję za wszelkie wskazówki. Ja już dostaję spazmów, bo nie mam pojęcia co tu nie gra.

Pozdrawiam,
Dawid.

edytowany 1x, ostatnio: dawid75_75, 2018-12-29 22:28

Pozostało 580 znaków

2018-12-30 01:22
0

A gdyby po prostu przesłać stringa lub inta i parsnąć go w środku?

edytowany 2x, ostatnio: WeiXiao, 2018-12-30 01:27

Pozostało 580 znaków

2018-12-30 03:31
0

A jak przesyłasz z widoku do akcji? Bo to co pokazałeś, to przesłanie z akcji do widoku i to powinno działać prawidłowo.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
Napisał Url.Action("Akcja", "Kontroler", new{TypEnum = typEnum}) - WeiXiao 2018-12-30 03:51
To jest generowanie linka, nie przesłanie z widoku do akcji. Nie wiadomo nawet, czy tam gdzieś jest akcja, która ma coś odebrać... - somekind 2018-12-30 03:51
No generuje się link, który prześle parametry urlem. Czym to się różni jeżeli chodzi o "przesyłanie z widoku do akcji" albo co masz na myśli (js/form?)? - WeiXiao 2018-12-30 04:06
No jak wywołuję tę akcję i jak wygląda kod tej akcji. Bo może jej w ogóle nie ma i stąd cały problem. - somekind 2018-12-30 16:32

Pozostało 580 znaków

2018-12-30 10:12
0
WeiXiao napisał(a):

A gdyby po prostu przesłać stringa lub inta i parsnąć go w środku?

Co masz dokładnie na myśli? Chodzi Ci o pominięcie przekazywania enuma w parametrze i dobranie się do TempData na poziomie wywoływanej akcji czy przesłanie stringa jako parametru i parsowanie w akcji?

Pozostało 580 znaków

2018-12-30 10:17
0
somekind napisał(a):

A jak przesyłasz z widoku do akcji? Bo to co pokazałeś, to przesłanie z akcji do widoku i to powinno działać prawidłowo.

Ja też nie do końca rozumiem. Mam akcję Akcja w kontrolerze Kontroler, sygnatura:

public ActionResult Akcja(MyEnumType typEnum)

Ten url:

Url.Action("Akcja", "Kontroler", new{TypEnum = typEnum})

jest przypisany do przycisku, który jest osadzony w tabeli.

Pozostało 580 znaków

2018-12-30 10:36
0
dawid75_75 napisał(a):
somekind napisał(a):

A jak przesyłasz z widoku do akcji? Bo to co pokazałeś, to przesłanie z akcji do widoku i to powinno działać prawidłowo.

Ja też nie do końca rozumiem. Mam akcję Akcja w kontrolerze Kontroler, sygnatura:

public ActionResult Akcja(MyEnumType typEnum)

Ten url:

Url.Action("Akcja", "Kontroler", new{TypEnum = typEnum})

jest przypisany do przycisku, który jest osadzony w tabeli.

Ważne jest też (tak mi się wydaje) nazwa parametru w akcji. Domyślnie w routingu jest id. I daj też tak na akcję.

public ActionResult Akcja(MyEnumType id)

Pozostało 580 znaków

2018-12-30 10:53
0

Id też przesyłam, ale z tym nie ma żadnego problemu. Sygnatura formalnie wygląda tak:

public ActionResult Akcja(int id, MyEnumType typEnum)

a urla generuję tak:

Url.Action("Akcja", "Kontroler", new{Id = Model.id, TypEnum = typEnum})

I z przekazywaniem id nie ma żadnego problemu, zawsze jest prawidłowe. Dlatego pominąłem id w rozważaniach. Problem w tym, że jak zrobię na widoku tak:

@{
 var typEnum = TempData["klucz"] as MyEnumType?;
}
...
Url.Action("Akcja", "Kontroler", new{Id = Model.id, TypEnum = typEnum})

to do akcji Akcja leci null pomimo tego, że w zmiennej jest prawidłowa wartość. Kidey robię dla przykładu tak:

@{
 var typEnum = MyEnumType.Etykieta1;
}
...
Url.Action("Akcja", "Kontroler", new{Id = Model.id, TypEnum = typEnum})

to wtedy jest przekazywana prawidłowa wartość.
Nie mam pojęcia skąd takie zachowanie. Dodam, że przycisk, do którego zapisuję url'a jest na gridzie devexpressowym. Powtarzam też, że debugowanie krok po kroku pokazuje wyraźnie, że generowany jest prawidłowy url.

Pozostało 580 znaków

2018-12-30 12:19
1

Stawiam na routing

Też miałem takie podejrzenie, ale za diabła nie rozumiem czemu przesyłając to samo w postaci zmiennej nie jest przekazywane, a wpisane na sztywno dokładnie to samo już jest przekazywane prawidłowo. - dawid75_75 2018-12-30 13:11

Pozostało 580 znaków

2018-12-30 13:06
0
dawid75_75 napisał(a):

Id też przesyłam, ale z tym nie ma żadnego problemu. Sygnatura formalnie wygląda tak:

public ActionResult Akcja(int id, MyEnumType typEnum)

a urla generuję tak:

Url.Action("Akcja", "Kontroler", new{Id = Model.id, TypEnum = typEnum})

W akcji parametr ma nazwę typEnum, a przesyłasz o nazwie TypEnum? spróbuj takie samie

Mając takie coś:

public enum Test
{
    A,
    B,
    C
}

public IActionResult Test(Test input)
{
    var type = input;
    Console.WriteLine(type.GetType());
    return View();
}
@Html.ActionLink("Nazwa", "Test", "Controller", new { input = Test.B }) 

Wynik: wyświetla test.Models.Test z wartością B

@Html.ActionLink("Nazwa", "Test", "Controller", new { input = "A"})

Wynik: wyświetla test.Models.Test z wartością A

@Html.ActionLink("Nazwa", "Test", "Controller", new { input = "1"})

Wynik: wyświetla test.Models.Test z wartością B

zatem działa - ale chyba tylko na .NET Corze? dziwne

edytowany 13x, ostatnio: WeiXiao, 2018-12-30 13:24

Pozostało 580 znaków

2018-12-30 13:15
0
WeiXiao napisał(a):
dawid75_75 napisał(a):

Id też przesyłam, ale z tym nie ma żadnego problemu. Sygnatura formalnie wygląda tak:

public ActionResult Akcja(int id, MyEnumType typEnum)

a urla generuję tak:

Url.Action("Akcja", "Kontroler", new{Id = Model.id, TypEnum = typEnum})

W akcji parametr ma nazwę typEnum, a przesyłasz o nazwie TypEnum? spróbuj takie samie

Tak samo nie działa. Poza tym, kiedy wyślę enuma wpisanego na sztywno to działa mimo różnicy wielkości znaków, tak więc bindowanie parametrów jest case insensitive.

sprawdź edit - WeiXiao 2018-12-30 13:16
@dawid75_75: no chyba, że to tylko na .NET Corze działa z jakiegoś powodu - WeiXiao 2018-12-30 13:22

Pozostało 580 znaków

2018-12-30 13:27
0

Może dodaj sobie do routingu opcjonalny parametr po id o nazwie takiej jak w akcji

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