Saya SANGAT bingung mengapa kode ini
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
hasil dalam tautan ini:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
Bagian hidefocus
yang ingin saya capai, tetapi dari mana datangnya ?Length=4
?
asp.net-mvc
Alter Ego saya
sumber
sumber
Jawaban:
Panjang = 4 berasal dari upaya untuk membuat serialisasi objek string. Kode Anda menjalankan
ActionLink
metode ini :Ini mengambil
string
objek "Home" untuk routeValues, yang dicari oleh pipa MVC untuk properti publik mengubahnya menjadi nilai rute. Dalam kasusstring
objek, satu-satunya properti publik adalahLength
, dan karena tidak akan ada rute yang ditentukan dengan parameter Panjang, ia menambahkan nama properti dan nilai sebagai parameter string kueri. Anda mungkin akan menemukan jika Anda menjalankan ini dari halaman yang tidak ada diHomeController
dalamnya akan menimbulkan kesalahan tentangAbout
metode tindakan yang hilang . Coba gunakan yang berikut ini:sumber
Url.Action()
. Mengubah dariUrl.Action("Action", "Controller", new { area = "" })
menjadiUrl.Action("Action", new { controller = "Controller", area = "" })
menjaga properti Panjang agar tidak muncul.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
Cara saya mengatasi ini adalah menambahkan nol ke parameter keempat sebelum deklarasi anonim (
new {}
) sehingga menggunakan metode overload berikut: (linkText, actionName, controllerName, routeValues, htmlAttributes):sumber
controller
danarea
untuk menjaga properti Length agar tidak muncul di URL.routeValues
tetapi hanya area. Misalnya:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, MVC akan memasukkanLength=x
parameter aneh di akhir URL. Misalnya, letakkan ini di halaman, lalu lihat sumber halaman Anda, dan Anda akan melihat apa yang saya maksud:@Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
Tetapi jika Anda memasukkancontroller
entri dirouteValues
, itu tidak akan pernah dimasukkan keLength=x
dalam URL.@
di@area = "Admin"
, supaya kau tahu.Anda lupa menambahkan parm HTMLAttributes.
Ini akan berfungsi tanpa perubahan:
sumber
Parameter untuk ActionLink tidak benar, itu berusaha untuk menggunakan nilai "Rumah" sebagai nilai rute, bukan tipe anonim.
Saya yakin Anda hanya perlu menambahkan
new { }
ataunull
sebagai parameter terakhir.EDIT: Cukup baca kembali posting dan sadari Anda mungkin ingin menentukan nol sebagai parameter terakhir kedua, bukan yang terakhir.
sumber
Ini akan mengambil kelebihan: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
sumber
Mohon gunakan metode overload kanan dengan lima (5) parameter. Contoh:
sumber
Hapus "Rumah" (nama pengontrol) sehingga kodenya adalah:
sumber
Dengan nama atribut:
sumber
Seperti yang ditunjukkan Jonathon Watney dalam komentar, ini juga berlaku untuk
metode. Dalam kasus saya, saya berada di Create.cshtml menargetkan permintaan posting dari controller yang sesuai + Buat tindakan dan punya
yang menambahkan querystring "? Panjang = 6" ke tindakan bentuk saat diberikan. Diisyaratkan oleh jawaban yang disetujui roryf dan menyadari panjang string "Buat" adalah 6, saya akhirnya menyelesaikan ini dengan menghapus spesifikasi tindakan eksplisit:
sumber
Mungkin orang lain memiliki masalah yang sama dan perlu menyediakan nilai kelas melalui parm HTMLAttributes . Inilah solusi saya:
sumber
Mencari jawaban untuk pertanyaan saya mendarat saya di sini, pada dasarnya itu adalah pilihan kelebihan yang benar
@Html.ActionLink
yang penting.Saya memilih kelebihan yang tidak ada, ( tanpa yang terakhir
null
), danMVC
tidak memiliki overload seperti itu, menghasilkan URL palsu seperti yang disebutkan OP.Catatan pribadi : Anda dapat menggunakan
use
jenis anonim tidak berarti Anda dapat menggunakan kelebihan beban mana pun - yang tidak ada? - pastikan: itu memiliki didefinisikan!- Datang ke sini pada masa MVC 5.2
sumber