Jestem BARDZO zdezorientowany, dlaczego ten kod
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
wyniki w tym linku:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
hidefocus
Częścią jest to, czego dąży do osiągnięcia, ale skąd ?Length=4
pochodzi?
asp.net-mvc
My Alter Ego
źródło
źródło
Odpowiedzi:
Długość = 4 pochodzi z próby serializacji obiektu łańcuchowego. Twój kod to uruchamia
ActionLink
metodę:Pobiera to
string
obiekt „Home” dla routeValues, który instalator MVC szuka właściwości publicznych, zamieniając je w wartości trasy. W przypadkustring
obiektu jedyną właściwością publiczną jestLength
, a ponieważ nie będzie zdefiniowanych tras za pomocą parametru Długość, dołącza nazwę i wartość właściwości jako parametr ciągu zapytania. Prawdopodobnie przekonasz się, że jeśli uruchomisz to ze strony, która nie jest naHomeController
niej, zgłosi błąd dotyczący brakuAbout
metody działania. Spróbuj użyć następujących opcji:źródło
Url.Action()
. Zmiana zUrl.Action("Action", "Controller", new { area = "" })
naUrl.Action("Action", new { controller = "Controller", area = "" })
powoduje, że właściwość Length nie jest wyświetlana.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
Rozwiązałem to poprzez dodanie wartości null do czwartego parametru przed deklaracją anonimową (
new {}
), aby używał następującego przeciążenia metody: (linkText, actionName, controllerName, routeValues, htmlAttributes):źródło
controller
i,area
aby właściwość Length nie była wyświetlana w adresie URL.routeValues
tylko w obszarze. Na przykład:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, MVC będzie zawierać dziwnyLength=x
parametr na końcu adresu URL. Na przykład, umieść to na stronie, a następnie wyświetl źródło swojej strony, a zobaczysz, co mam na myśli:@Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
Ale jeśli umieściszcontroller
wpis wrouteValues
, nigdy nie będzie on wstawiałLength=x
adresu URL.@
w@area = "Admin"
, tylko dlatego, że wiesz.Zapomniałeś dodać parm HTMLAttributes.
Będzie to działać bez żadnych zmian:
źródło
Parametry ActionLink są niepoprawne, próbuje użyć wartości „Home” jako wartości trasy, zamiast typu anonimowego.
Uważam, że wystarczy dodać
new { }
lubnull
jako ostatni parametr.EDYCJA: Po prostu ponownie przeczytaj post i zdałeś sobie sprawę, że prawdopodobnie będziesz chciał określić null jako drugi ostatni parametr, a nie ostatni.
źródło
Spowoduje to przeciążenie: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
źródło
Łagodnie używaj odpowiednio przeciążonej metody z pięcioma (5) parametrami. Przykład:
źródło
Wystarczy usunąć „Dom” (nazwa kontrolera), aby kod był:
źródło
Z nazwami atrybutów:
źródło
Jak zauważył Jonathon Watney w komentarzu, dotyczy to również
metody W moim przypadku byłem w pliku Create.cshtml kierującym żądanie postu odpowiedniego kontrolera + akcja Create i miałem
który dodaje kwerendę „? Długość = 6” do akcji formularza podczas renderowania. Na podstawie zatwierdzonej odpowiedzi roryfa i uświadomienia sobie, że długość ciągu „Utwórz” wynosi 6, w końcu rozwiązałem to, usuwając jawną specyfikację akcji:
źródło
Być może inni mieli ten sam problem i musieli podać wartość klasy poprzez HTMLAttributes parm. Oto moje rozwiązanie:
źródło
Poszukiwanie odpowiedzi na moje pytanie wylądowało tutaj, w zasadzie wybór właściwego przeciążenia,
@Html.ActionLink
który ma znaczenie.Ja wybierając przeciążenia, które nie istnieje, ( bez ostatni
null
), iMVC
nie miał takiego przeciążenia, w wyniku fałszywego adresu URL coś podobnego PO wymienione.Osobista uwaga: możesz
use
anonimowych typów nie oznacza, że możesz użyć któregoś z przeciążeń - które nie istnieją? - mieć pewność: to ma być zdefiniowana!- Przybył tutaj w czasach MVC 5.2
źródło