Saya ingin tahu apakah Anda dapat membebani metode pengontrol di ASP.NET MVC. Setiap kali saya mencoba, saya mendapatkan kesalahan di bawah ini. Dua metode menerima argumen yang berbeda. Apakah ini sesuatu yang tidak bisa dilakukan?
Permintaan tindakan saat ini 'MyMethod' pada tipe pengontrol 'MyController' adalah ambigu antara metode tindakan berikut:
c#
asp.net-mvc
overloading
Papa Burgundy
sumber
sumber
Jawaban:
Anda dapat menggunakan atribut jika Anda ingin kode Anda melakukan overloading.
Tapi, Anda harus menggunakan nama tindakan yang berbeda untuk metode http yang sama (seperti yang orang lain katakan). Jadi itu hanya semantik pada saat itu. Apakah Anda lebih suka nama dalam kode atau atribut Anda?
Phil memiliki artikel yang berkaitan dengan ini: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx
sumber
return View();
. Sebagai contoh:return View("MyOverloadedName");
.Iya. Saya sudah bisa melakukan ini dengan mengatur
HttpGet
/HttpPost
(atauAcceptVerbs
atribut yang setara ) untuk setiap metode pengontrol untuk sesuatu yang berbeda, yaitu,HttpGet
atauHttpPost
, tetapi tidak keduanya. Dengan begitu ia bisa mengetahui berdasarkan jenis permintaan metode mana yang digunakan.Satu saran yang saya miliki adalah bahwa, untuk kasus seperti ini, akan memiliki implementasi pribadi yang bergantung pada kedua metode Tindakan publik Anda untuk menghindari duplikasi kode.
sumber
Show()
metode Anda memiliki tanda tangan yang berbeda. Jika dan ketika Anda perlu mengirim info ke versi Dapatkan, versi Dapatkan dan Posting Anda kemudian berakhir dengan tanda tangan yang sama, dan Anda akan memerlukanActionName
atribut atau salah satu perbaikan lain yang disebutkan dalam posting ini.ActionNameAttribute
. Dalam praktiknya, saya jarang menemukan itu yang menjadi masalah.Berikut ini hal lain yang dapat Anda lakukan ... Anda menginginkan metode yang dapat memiliki parameter dan tidak.
Kenapa tidak coba ini ...
Ini berhasil bagi saya ... dan dalam metode yang satu ini, Anda benar-benar dapat menguji untuk melihat apakah Anda memiliki parameter yang masuk.
Diperbarui untuk menghapus sintaks nullable yang tidak valid pada string dan menggunakan nilai parameter default.
sumber
string
tidak dapat dibatalkan.)string
tidak mungkinnullable
; tapi bisa sajanull
! Either way saya memposting komentar awal tanpa ketulusan.Tidak, Tidak dan Tidak. Pergi dan coba kode pengontrol di bawah ini di mana kita memiliki "LoadCustomer" kelebihan beban.
Jika Anda mencoba menjalankan tindakan "LoadCustomer" Anda akan mendapatkan kesalahan seperti yang ditunjukkan pada gambar di bawah ini.
Polimorfisme adalah bagian dari pemrograman C # sedangkan HTTP adalah sebuah protokol. HTTP tidak mengerti polimorfisme. HTTP berfungsi pada konsep atau URL dan URL hanya dapat memiliki nama unik. Jadi HTTP tidak menerapkan polimorfisme.
Untuk memperbaiki yang sama kita perlu menggunakan atribut "ActionName".
Jadi sekarang jika Anda melakukan panggilan ke URL "Pelanggan / LoadCustomer" tindakan "LoadCustomer" akan dipanggil dan dengan struktur URL "Pelanggan / LoadCustomerByName" "LoadCustomer (string str)" akan dipanggil.
Jawaban di atas telah saya ambil dari artikel proyek ini -> MVC Action overloading
sumber
Untuk mengatasi masalah ini, Anda dapat menulis
ActionMethodSelectorAttribute
yang memeriksaMethodInfo
untuk setiap tindakan dan membandingkannya dengan nilai-nilai Formulir yang diposting dan kemudian menolak metode apa pun yang nilai-nilai formulirnya tidak cocok (tidak termasuk nama tombol, tentu saja).Berikut ini contohnya: - http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/
TAPI, ini bukan ide yang baik.
sumber
Sejauh yang saya tahu Anda hanya dapat memiliki metode yang sama saat menggunakan metode http yang berbeda.
yaitu
sumber
[HttpPost]
atribut sebagai ganti[AcceptVerbs("POST")]
.Saya telah mencapai ini dengan bantuan Routing Atribut di MVC5. Memang saya baru mengenal MVC yang berasal dari satu dekade pengembangan web menggunakan WebForms, tetapi berikut ini berhasil bagi saya. Berbeda dengan jawaban yang diterima, ini memungkinkan semua tindakan kelebihan diberikan oleh file tampilan yang sama.
Pertama-tama aktifkan Attribute Routing di App_Start / RouteConfig.cs.
Secara opsional, hiasi kelas pengontrol Anda dengan awalan rute default.
Kemudian hiasi tindakan pengontrol Anda yang membebani satu sama lain dengan rute dan parameter umum yang sesuai. Menggunakan parameter tipe terbatas Anda dapat menggunakan format URI yang sama dengan ID dari tipe yang berbeda.
Semoga ini bisa membantu dan tidak membawa seseorang ke jalan yang salah. :-)
sumber
Anda dapat menggunakan satu
ActionResult
untuk menangani keduanyaPost
danGet
:Berguna jika Anda
Get
danPost
metode memiliki tanda tangan yang cocok.sumber
Saya baru saja menemukan pertanyaan ini dan, meskipun sudah cukup lama, masih sangat relevan. Ironisnya, satu komentar yang benar di utas ini diposting oleh seorang pemula yang mengaku di MVC ketika ia menulis posting tersebut. Bahkan dokumen ASP.NET tidak sepenuhnya benar. Saya memiliki proyek besar dan saya berhasil membebani metode tindakan.
Jika seseorang memahami perutean, di luar pola rute default {controller} / {action} / {id} sederhana, mungkin jelas bahwa tindakan controller dapat dipetakan menggunakan pola unik apa pun. Seseorang di sini berbicara tentang polimorfisme dan berkata: "HTTP tidak memahami polimorfisme", tetapi perutean tidak ada hubungannya dengan HTTP. Ini, sederhananya, mekanisme untuk pencocokan pola string.
Cara terbaik untuk membuat pekerjaan ini adalah dengan menggunakan atribut perutean, misalnya:
Tindakan ini akan mengurus url seperti
/cars/usa/new-york
dan/cars/usa/texas/dallas
, yang akan memetakan masing-masing tindakan Indeks pertama dan kedua.Memeriksa contoh controller ini terbukti bahwa itu melampaui pola rute default yang disebutkan di atas. Default berfungsi dengan baik jika struktur url Anda benar-benar cocok dengan konvensi penamaan kode Anda, tetapi ini tidak selalu terjadi. Kode harus deskriptif dari domain, tetapi url sering harus lebih jauh karena konten mereka harus didasarkan pada kriteria lain, seperti persyaratan SEO.
Manfaat dari pola perutean default adalah secara otomatis membuat rute unik. Ini diberlakukan oleh kompilator karena url akan cocok dengan tipe dan anggota pengontrol yang unik. Menggulirkan pola rute Anda sendiri akan membutuhkan pemikiran yang cermat untuk memastikan keunikan dan bahwa mereka bekerja.
Catatan penting Satu-satunya kelemahan adalah bahwa menggunakan perutean untuk menghasilkan url untuk tindakan yang berlebihan tidak bekerja ketika didasarkan pada nama tindakan, misalnya, ketika menggunakan UrlHelper.Action. Tapi itu berfungsi jika seseorang menggunakan rute bernama, misalnya, UrlHelper.RouteUrl. Dan menggunakan rute bernama, menurut sumber yang dihormati, cara untuk pergi bagaimanapun ( http://haacked.com/archive/2010/11/21/named-routes-to-the-rescue.aspx/ ).
Semoga berhasil!
sumber
Anda dapat menggunakan [ActionName ("NewActionName")] untuk menggunakan metode yang sama dengan nama yang berbeda:
sumber
Saya membutuhkan kelebihan untuk:
Ada beberapa argumen yang cukup di mana saya akhirnya melakukan ini:
Itu bukan solusi yang sempurna, terutama jika Anda memiliki banyak argumen, tetapi itu bekerja dengan baik untuk saya.
sumber
Saya juga menghadapi masalah yang sama dalam aplikasi saya. Tanpa Modifikasi informasi Metode apa pun, saya telah memberikan [ActionName ("SomeMeaningfulName")] pada Action head. masalah terselesaikan
sumber
Buat metode dasar sebagai virtual
Buat metode yang diganti sebagai ganti
Sunting: Ini jelas hanya berlaku jika metode override dalam kelas turunan yang tampaknya bukan niat OP.
sumber
Saya suka jawaban ini diposting di utas lain
Ini terutama digunakan jika Anda mewarisi dari pengontrol lain dan ingin mengganti aksi dari pengontrol dasar
ASP.NET MVC - Mengganti tindakan dengan parameter berbeda
sumber
Hanya ada satu tanda tangan publik yang diizinkan untuk setiap metode pengontrol. Jika Anda mencoba memuatnya secara berlebihan, itu akan dikompilasi, tetapi Anda mendapatkan kesalahan run-time yang Anda alami.
Jika Anda tidak mau menggunakan kata kerja yang berbeda (seperti
[HttpGet]
dan[HttpPost]
atribut ) untuk membedakan metode kelebihan beban (yang akan bekerja), atau mengubah perutean, maka yang tersisa adalah Anda bisa memberikan metode lain dengan nama yang berbeda, atau Anda bisa kirim dalam metode yang ada. Begini cara saya melakukannya:Saya pernah datang ke situasi di mana saya harus menjaga kompatibilitas ke belakang. Metode asli mengharapkan dua parameter, tetapi yang baru hanya memiliki satu. Kelebihan cara yang saya harapkan tidak berhasil karena MVC tidak menemukan titik masuk lagi.
Untuk mengatasinya, saya melakukan hal berikut:
Menciptakan satu metode publik baru yang berisi "hanya" 2 parameter string. Yang itu bertindak sebagai operator, yaitu:
Tentu saja, ini adalah retasan dan harus dire-refored nanti. Tetapi untuk saat ini, itu berhasil untuk saya.
Anda juga dapat membuat dispatcher seperti:
Anda dapat melihat, bahwa UpdateAction membutuhkan 2 parameter, sedangkan DeleteAction hanya membutuhkan satu parameter.
sumber
Maaf atas keterlambatannya. Saya dengan masalah yang sama dan saya menemukan tautan dengan jawaban yang bagus, dapatkah itu membantu orang baru
Semua kredit untuk situs web BinaryIntellect dan penulisnya
Pada dasarnya, ada empat situasi: menggunakan kata kerja differents , menggunakan perutean , menandai overload dengan atribut [NoAction] dan mengubah nama atribut aksi dengan [ActionName]
Jadi, tergantung itu adalah situasi dan situasi Anda.
Namun, ikuti tautannya:
Tautan: http://www.binaryintellect.net/articles/8f9d9a8f-7abf-4df6-be8a-9895882ab562.aspx
sumber
Jika ini merupakan upaya untuk menggunakan satu tindakan GET untuk beberapa tampilan yang POST ke beberapa tindakan dengan model yang berbeda, maka coba tambahkan tindakan GET untuk setiap tindakan POST yang dialihkan ke GET pertama untuk mencegah 404 saat refresh.
Skenario panjang namun umum.
sumber