Saya sedang membangun satu API tenang menggunakan ASP.NET Core MVC dan saya ingin menggunakan parameter querystring untuk menentukan penyaringan dan paging pada sumber daya yang mengembalikan koleksi.
Dalam hal ini, saya perlu membaca nilai yang dikirimkan dalam querystring untuk memfilter dan memilih hasil untuk dikembalikan.
Saya sudah menemukan bahwa di dalam Get
tindakan pengontrol mengakses HttpContext.Request.Query
mengembalikan satu IQueryCollection
.
Masalahnya adalah saya tidak tahu bagaimana ini digunakan untuk mengambil nilai. Sebenarnya, saya pikir cara untuk melakukannya adalah dengan menggunakan, misalnya
string page = HttpContext.Request.Query["page"]
Masalahnya adalah bahwa HttpContext.Request.Query["page"]
tidak mengembalikan string, tetapi a StringValues
.
Lagi pula, bagaimana cara menggunakan IQueryCollection
untuk benar-benar membaca nilai querystring?
sumber
Jawaban:
Anda dapat menggunakan
[FromQuery]
untuk mengikat model tertentu ke querystring:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
misalnya
sumber
[FromQuery]
attrib juga dapat dimatikan karena .net binding akan memeriksa semua input form dan url querystring params secara default, kecuali bahwa Anda memiliki beberapa alasan untuk membatasi sumbernya.Anda bisa menggunakan metode ToString
IQueryCollection
yang akan mengembalikan nilai yang diinginkan jikapage
parameter tunggal ditentukan:jika ada beberapa nilai seperti
?page=1&page=2
maka hasil dari panggilan ToString adalah1,2
Tetapi seperti yang disarankan @ mike-g dalam jawabannya, Anda sebaiknya menggunakan model binding dan tidak langsung mengakses
HttpContext.Request.Query
objek.sumber
ASP.NET Core akan secara otomatis mengikat
form values
,route values
danquery strings
berdasarkan nama. Ini artinya Anda cukup melakukan ini:Sumber: Cara kerja model mengikat
FYI, Anda juga dapat menggabungkan pendekatan otomatis dan eksplisit:
sumber
Anda bisa membuat objek seperti ini:
Dan kemudian di controller hanya membuat sesuatu seperti itu:
Lebih baik lagi, Anda dapat membuat model API dari:
untuk:
sumber
Berikut adalah contoh kode yang saya gunakan (dengan tampilan .NET Core):
sumber
StringValues
adalah array string . Anda bisa mendapatkan nilai string Anda dengan memberikan indeks, misHttpContext.Request.Query["page"][0]
.sumber
IQueryCollection
memilikiTryGetValue()
di atasnya yang mengembalikan nilai dengan kunci yang diberikan. Jadi, jika Anda memiliki parameter kueri yang disebutsomeInt
, Anda dapat menggunakannya seperti ini:Perhatikan bahwa kecuali Anda memiliki beberapa parameter dengan nama yang sama,
StringValues
jenisnya tidak menjadi masalah.sumber
di .net core jika Anda ingin mengakses querystring dalam pandangan kami gunakan seperti
jika kita berada di lokasi di mana @Context tidak tersedia, kita dapat menyuntikkannya
juga untuk cookie
sumber
Saya punya solusi yang lebih baik untuk masalah ini,
var searchparams = await Request.GetSearchParams();
Saya telah membuat kelas statis dengan beberapa metode ekstensi
dengan cara ini Anda dapat dengan mudah mengakses semua parameter pencarian Anda. Saya harap ini akan membantu banyak pengembang :)
sumber
Beberapa komentar menyebutkan ini juga, tetapi inti net asp melakukan semua ini untuk Anda.
Jika Anda memiliki string kueri yang cocok dengan namanya, string itu akan tersedia di controller.
https: // myapi / some-endpoint / 123? someQueryString = YayThisWorks
Ouputs:
123
YayThisWorks
sumber