2012-10-25 22 views
6

Pracuję z MVC w .net 4.0. Mam podstawowe Html.ActionLink i chcę przekazać wiele parametrów do kontrolera/działania.Jak przekazać wiele parametrów (niektóre złożone obiekty) za pomocą Html.ActionLink

Za każdym razem, gdy debuguję ActionResult, tylko JEDEN z moich parametrów przychodzi, a drugi ma wartość zerową (w zależności od tego, która jest pierwsza). Teraz wiem, że mogę przekazywać skomplikowane obiekty, ponieważ mogę uzyskać obiekt "Ligi". Jednak nie jestem pewien, dlaczego tylko JEDEN z moich parametrów pokonuje go w dowolnym momencie.

kod w widoku (nie nękać mnie o ViewBag wiem, że to nie jest popularne również League to kompleks obiektów..)

@Html.ActionLink("Sort By WeeK", "Sort", "Schedule", 
       new { league = ViewBag.League, sortType = "Week" }, null) 

kod w kontrolerze: (tu żadnych niespodzianek)

public ActionResult Sort(League league, string sortType) 
{ 
    //Do some stuff here 
    return View("Schedule"); 
} 

Zgaduję, że odpowiedź będzie dotyczyć routingu. Co prowadzi mnie do drugiego pytania. Jak mogę uruchomić tego typu ActionLink (Action/Controller/Collection of Complex i Simple objects), aby pracować bez ciągłego dodawania nowych maproutów. Czy istnieje ogólna/wieloznaczna RouteMap, którą mógłbym dodać, więc nie muszę ciągle dodawać anatomicznie identycznych map tras do global.asax. A może potrzebuję pewnej elastyczności w typie obiektów, które chciałbym przekazać do akcji, więc nie mogę wstępnie zdefiniować dokładnego podpisu.

Widziałem wiele postów na ten temat, ale żaden z nich nie odpowiedział na moje pytania.

+0

dziwne. Wypróbuj FormCollection w akcji kontrolera i sprawdź, czy zwraca wiele kluczy. W najgorszym przypadku można zmienić go w formularz i przesłać ukryty kod HTML. – Ammar

+0

Kiedy mówisz "Który jest pierwszy", masz na myśli przede wszystkim podpis metody lub pierwszy adres URL linku? Jak wygląda wygenerowany URL? –

Odpowiedz

4

Myślę, że może się mylić z powodu parametru null. Spróbuj tego:

@Html.ActionLink("Sort By WeeK", actionName:"Sort", controllerName: "Schedule", routeValues: new { league = ViewBag.League, sortType = "Week" }, htmlAttributes:null) 
+0

Dzięki za opinię. Testuję to i wracam do ciebie. W miarę rozszerzania zasięgu obiektu League obiekt stał się własnością publiczną kontrolera, więc nie musiałem już go przekazywać. Wypróbuję Twoją sugestię następnym razem, gdy będę musiał podać więcej niż jeden parametr i opublikować wyniki tutaj. Szczęśliwy piątek. – ArdAtak

+0

Przepraszamy za spóźnioną odpowiedź, ale właśnie to zobaczyłem i doszedłem do wniosku, że wciąż mam potwierdzenie. Ta sugestia zadziałała. Dzięki. – ArdAtak

0

Próbuję wiele sposobów, ale nikt nie może mi pomóc, w końcu i `sam rozwiązał problem, po prostu„rozpakować”swój obiekt na zmiennych z obiektu, na przykład:

@{ var sendObject = (MyObject) ViewData["SendObject"]; } 
... 
@Html.ActionLink("Description", "MyActionName", "MyController", new { sendObject.var1, sendObject.var2, sendObjec.var3, sortType = "Week" }, new { @style = "color: white" }) 

Kontroler:

public ActionResult MyActionName(MyObject sendObject, string sortType) 
{ 
... 
} 

ramowa sam wil wiążą Twój obiekt SendObject

0

Zrób to po prostu:

VIEW: 
@Html.ActionLink("Link text", "Action name", "Controller name", 
         new { paramName1 = @modelDataItem.value, paramName2 = @modelDataItem.value}, null) 

CONTROLLER: 
public ActionResult ActionName(string paramName1 , string paramName2) 

Nb: upewnij się, że nazwy parametrów w działaniach kontrolera są takie same, jak te używane w łączu akcji. Jeśli wartości nie są dostarczane do parametrów akcji, sprawdź, czy modele widoku zawierają wartość, której szukasz. Być może nigdy nie został wysłany do widoku.

Powiązane problemy