Przekazywanie parametru z widoku do akcji.

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.

0

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

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.

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?

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.

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)
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.

1

Stawiam na routing

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

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.

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