Apakah ada cara mudah untuk menangani beberapa tombol kirim dari formulir yang sama? Sebagai contoh:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>
Adakah yang tahu bagaimana melakukan ini di ASP.NET Framework Beta? Semua contoh yang saya cari di Google memiliki satu tombol di dalamnya.
c#
html
asp.net-mvc
http-post
form-submit
Spoike
sumber
sumber
Jawaban:
Berikut ini adalah sebagian besar solusi berbasis atribut bersih untuk masalah tombol kirim banyak didasarkan pada posting dan komentar dari Maarten Balliauw .
pisau cukur:
dan pengontrol:
Pembaruan: Halaman silet terlihat memberikan fungsi yang sama di luar kotak. Untuk pengembangan baru, mungkin lebih disukai.
sumber
return View(viewmodel)
dalam kasus di mana model Anda memiliki kesalahan, itu akan berusaha untuk mengembalikan tampilan yang disebutSend
atau tergantung pada apa nama argumen Anda.return View("Index", viewModel)
Beri nama tombol kirim Anda, dan kemudian periksa nilai yang dikirimkan dalam metode pengontrol Anda:
memposting ke
EDIT:
Untuk memperluas pendekatan ini agar berfungsi dengan situs yang dilokalkan, pisahkan pesan Anda di tempat lain (mis. Kompilasi file sumber daya ke kelas sumber daya yang diketik dengan sangat baik)
Kemudian modifikasi kode sehingga berfungsi seperti:
dan controller Anda akan terlihat seperti ini:
sumber
Anda dapat memeriksa nama dalam aksi seperti yang telah disebutkan, tetapi Anda dapat mempertimbangkan apakah ini desain yang baik atau tidak. Merupakan ide bagus untuk mempertimbangkan tanggung jawab tindakan dan tidak memadukan desain ini terlalu banyak dengan aspek UI seperti nama tombol. Jadi pertimbangkan menggunakan 2 formulir dan 2 tindakan:
Juga, dalam kasus "Batal", Anda biasanya tidak memproses formulir dan pergi ke URL baru. Dalam hal ini Anda tidak perlu mengirimkan formulir sama sekali dan hanya perlu tautan:
sumber
Eilon menyarankan Anda untuk melakukannya seperti ini:
Saya suka metode ini karena tidak bergantung pada properti nilai dari tombol kirim yang lebih mungkin berubah daripada nama yang diberikan dan tidak memerlukan javascript untuk diaktifkan
Lihat: http://forums.asp.net/p/1369617/2865166.aspx#2865166
sumber
Baru saja menulis posting tentang itu: Beberapa tombol kirim dengan ASP.NET MVC :
Pada dasarnya, alih-alih menggunakan
ActionMethodSelectorAttribute
, saya menggunakanActionNameSelectorAttribute
, yang memungkinkan saya untuk berpura-pura nama tindakan adalah apa pun yang saya inginkan. Untungnya,ActionNameSelectorAttribute
tidak hanya membuat saya menentukan nama tindakan, tetapi saya dapat memilih apakah tindakan saat ini sesuai dengan permintaan.Jadi ada kelas saya (tapi saya tidak terlalu suka nama):
Untuk menggunakan cukup tentukan formulir seperti ini:
dan pengontrol dengan dua metode
Seperti yang Anda lihat, atribut tidak mengharuskan Anda untuk menentukan apa pun. Juga, nama tombol diterjemahkan langsung ke nama metode. Selain itu (saya belum mencobanya) ini harus berfungsi sebagai tindakan normal juga, sehingga Anda dapat memposting ke salah satu dari mereka secara langsung.
sumber
submit
tag dari pertimbangan, yang sangat ideal karena merupakan atribut murni-UI yang seharusnya tidak memiliki bantalan pada kontrol aliran. Alih-alih,name
atribut unik dari setiapsubmit
tag diterjemahkan secara langsung menjadi metode tindakan terpisah pada pengontrol Anda.pendek dan sesuai:
dan lakukan seperti ini di belakang kode
Semoga berhasil.
sumber
Saya akan menyarankan pihak yang berkepentingan untuk melihat solusi Maarten Balliauw . Saya pikir ini sangat elegan.
Jika tautan menghilang, ia menggunakan
MultiButton
atribut yang diterapkan pada tindakan pengontrol untuk menunjukkan klik tombol mana yang harus dikaitkan dengan tindakan tersebut.sumber
Anda harus dapat memberi nama tombol dan memberi nilai; lalu petakan nama ini sebagai argumen untuk tindakan tersebut. Atau, gunakan 2 tautan tindakan atau 2 formulir terpisah.
sumber
Anda bisa menulis:
Dan kemudian di halaman periksa apakah nama == "Kirim" atau nama == "Batalkan" ...
sumber
Sesuatu yang saya tidak suka dari ActionSelectName adalah IsValidName dipanggil untuk setiap metode tindakan di controller; Saya tidak tahu mengapa ini bekerja seperti ini. Saya suka solusi di mana setiap tombol memiliki nama yang berbeda berdasarkan fungsinya, tapi saya tidak suka kenyataan bahwa Anda harus memiliki banyak parameter dalam metode tindakan seperti tombol dalam formulir. Saya telah membuat enum untuk semua jenis tombol:
Alih-alih ActionSelectName, saya menggunakan ActionFilter:
Filter akan menemukan nama tombol dalam data formulir dan jika nama tombol cocok dengan salah satu jenis tombol yang ditentukan dalam enum, itu akan menemukan parameter ButtonType di antara parameter tindakan:
dan kemudian dalam pandangan, saya bisa menggunakan:
sumber
Inilah yang paling cocok untuk saya:
sumber
Saya telah menemukan 'masalah' ini juga tetapi menemukan solusi yang lebih logis dengan menambahkan
name
atribut. Saya tidak ingat memiliki masalah ini dalam bahasa lain.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Berarti
value
atribut kode berikut dapat diubah, dilokalkan, diinternasionalkan tanpa perlu kode tambahan memeriksa file sumber daya konstan atau konstanta.Di sisi penerima, Anda hanya perlu memeriksa apakah ada jenis pengiriman yang Anda ketahui tidak
null
sumber
Jika Anda tidak memiliki batasan dalam penggunaan HTML 5, Anda dapat menggunakan
<button>
tag denganformaction
Atribut:Referensi: http://www.w3schools.com/html5/att_button_formaction.asp
sumber
Jika browser Anda mendukung formulasi atribut untuk tombol input (IE 10+, tidak yakin tentang browser lain) maka yang berikut ini akan berfungsi:
sumber
Ada tiga cara yang dapat digunakan untuk menyelesaikan masalah di atas
Di bawah ini adalah video yang merangkum ketiga pendekatan secara demonstratif.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Cara HTML: -
Dengan cara HTML kita perlu membuat dua formulir dan menempatkan tombol "Kirim" di dalam masing-masing formulir. Dan setiap tindakan bentuk akan menunjuk ke tindakan yang berbeda / masing-masing. Anda dapat melihat kode di bawah ini formulir pertama memposting ke "Action1" dan bentuk kedua akan memposting ke "Action2" tergantung pada tombol "Kirim" yang diklik.
Cara Ajax: -
Jika Anda seorang pecinta Ajax, opsi kedua ini akan membuat Anda lebih bergairah. Dengan cara Ajax kita dapat membuat dua fungsi berbeda "Fun1" dan "Fun1", lihat kode di bawah ini. Fungsi-fungsi ini akan membuat panggilan Ajax dengan menggunakan JQUERY atau kerangka kerja lainnya. Masing-masing fungsi ini diikat dengan acara "Kirim" tombol "OnClick". Masing-masing fungsi melakukan panggilan ke nama tindakan masing-masing.
Menggunakan "ActionNameSelectorAttribute": -
Ini adalah opsi yang bagus dan bersih. "ActionNameSelectorAttribute" adalah kelas atribut sederhana di mana kita dapat menulis logika pengambilan keputusan yang akan memutuskan tindakan mana yang dapat dieksekusi.
Jadi hal pertama adalah dalam HTML kita harus meletakkan nama yang tepat untuk tombol kirim untuk mengidentifikasi mereka di server.
Anda dapat melihat kami telah memasukkan "Simpan" dan "Hapus" ke nama tombol. Anda juga dapat melihat dalam tindakan yang baru saja kita masukkan nama pengontrol "Pelanggan" dan bukan nama tindakan tertentu. Kami berharap nama tindakan akan diputuskan oleh "ActionNameSelectorAttribute".
Jadi ketika tombol kirim diklik, itu pertama hits atribut "ActionNameSelector" dan kemudian tergantung pada yang mengirimkan dipecat itu memanggil tindakan yang sesuai.
Jadi langkah pertama adalah membuat kelas yang mewarisi dari kelas "ActionNameSelectorAttribute". Di kelas ini kami telah membuat properti sederhana "Nama".
Kita juga perlu mengganti fungsi "IsValidName" yang mengembalikan true atau flase. Fungsi ini adalah tempat kita menulis logika apakah suatu tindakan harus dijalankan atau tidak. Jadi jika fungsi ini mengembalikan true maka tindakan dieksekusi atau tidak.
Jantung utama dari fungsi di atas adalah dalam kode di bawah ini. Koleksi "ValueProvider" memiliki semua data yang telah diposting dari formulir. Jadi pertama-tama mencari nilai "Nama" dan jika ditemukan dalam permintaan HTTP, ia mengembalikan nilai true atau ia mengembalikan nilai false.
Kelas atribut ini kemudian dapat didekorasi dengan aksi masing-masing dan nilai "Nama" masing-masing dapat diberikan. Jadi jika kiriman memukul tindakan ini dan jika nama yang cocok dengan HTML kirimkan nama tombol itu maka jalankan tindakan lebih lanjut atau yang tidak.
sumber
David Findley menulis tentang 3 opsi berbeda yang Anda miliki untuk melakukan ini, di weblog ASP.Net-nya.
Baca artikel banyak tombol dalam bentuk yang sama untuk melihat solusinya, dan kelebihan dan kekurangan masing-masing. IMHO dia memberikan solusi yang sangat elegan yang memanfaatkan atribut yang Anda hiasi dengan tindakan Anda.
sumber
Ini adalah teknik yang saya gunakan dan saya belum melihatnya di sini. Tautan (diposting oleh Saajid Ismail) yang menginspirasi solusi ini adalah http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-s---formform .aspx ). Ini mengadaptasi jawaban Dylan Beattie untuk melakukan lokalisasi tanpa masalah.
Dalam Tampilan:
Di Controller:
sumber
<input>
elemen. Saya menggunakan<button>
, yang diperlukan untuk melakukan pelokalan tanpa memiliki atribut nilai variabel.Script ini memungkinkan untuk menentukan atribut data-form-action yang akan berfungsi sebagai atribut formulasi HTML5 di semua browser (dengan cara yang tidak mencolok):
Formulir yang berisi tombol akan diposting ke URL yang ditentukan dalam atribut data-form-action:
Ini membutuhkan jQuery 1.7. Untuk versi sebelumnya Anda harus menggunakan
live()
bukanon()
.sumber
Inilah metode ekstensi yang saya tulis untuk menangani beberapa gambar dan / atau tombol teks.
Inilah HTML untuk tombol gambar:
atau untuk tombol kirim teks:
Ini adalah metode ekstensi yang Anda panggil dari pengontrol
form.GetSubmitButtonName()
. Untuk tombol gambar, ia mencari parameter formulir dengan.x
(yang menunjukkan tombol gambar diklik) dan mengekstrak namanya. Untukinput
tombol biasa, ia mencari nama yang dimulai denganSubmit_
dan mengekstrak perintah dari sesudahnya. Karena saya mengabstraksi logika menentukan 'perintah' Anda dapat beralih di antara tombol gambar + teks pada klien tanpa mengubah kode sisi server.Catatan: Untuk tombol teks Anda harus mengawali nama dengan
Submit_
. Saya lebih suka cara ini karena itu berarti Anda dapat mengubah nilai teks (tampilan) tanpa harus mengubah kode. Tidak sepertiSELECT
elemen, sebuahINPUT
tombol hanya memiliki atribut 'nilai' dan tidak ada teks 'terpisah'. Tombol saya mengatakan hal-hal yang berbeda dalam konteks yang berbeda - tetapi memetakan ke 'perintah' yang sama. Saya lebih suka mengekstraksi nama dengan cara ini daripada harus kode untuk== "Add to cart"
.sumber
Saya tidak punya cukup perwakilan untuk berkomentar di tempat yang benar, tetapi saya menghabiskan sepanjang hari untuk ini sehingga ingin berbagi.
Saat mencoba menerapkan solusi "MultipleButtonAttribute"
ValueProvider.GetValue(keyValue)
akan kembali salahnull
.Ternyata saya sedang mereferensikan System.Web.MVC versi 3.0 padahal seharusnya 4.0 (majelis lain adalah 4.0). Saya tidak tahu mengapa proyek saya tidak ditingkatkan dengan benar dan saya tidak punya masalah yang jelas.
Jadi, jika Anda
ActionNameSelectorAttribute
tidak bekerja ... periksa itu.sumber
Saya sangat terlambat ke pesta, tapi begini ... Implementasi saya meminjam dari @mkozicki tetapi membutuhkan lebih sedikit string yang dikodekan untuk mendapatkan kesalahan. Diperlukan kerangka kerja 4.5+ . Pada dasarnya, nama metode pengontrol harus menjadi kunci untuk perutean.
Markup . Nama tombol harus dikunci dengan
"action:[controllerMethodName]"
(perhatikan penggunaan C # 6 nameof API, memberikan referensi tipe khusus untuk nama metode pengontrol yang ingin Anda panggil.
Pengendali :
Atribut Magic . Perhatikan penggunaan
CallerMemberName
kebaikan.sumber
sumber
Saya telah mencoba membuat sintesis dari semua solusi dan menciptakan atribut [ButtenHandler] yang membuatnya mudah untuk menangani banyak tombol pada formulir.
Saya telah menjelaskannya pada beberapa tombol formulir CodeProject Multiple parameterized (localizable) di ASP.NET MVC .
Untuk menangani kasing sederhana dari tombol ini:
Anda akan memiliki sesuatu seperti metode tindakan berikut:
Perhatikan bagaimana nama tombol cocok dengan nama metode tindakan. Artikel ini juga menjelaskan cara memiliki tombol dengan nilai dan tombol dengan indeks.
sumber
sumber
ini adalah cara terbaik yang saya temukan:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Ini kodenya:
Nikmati tombol multi-kirim-kirim multi-tombol di masa depan.
Terima kasih
sumber
Versi
HttpParamActionAttribute
metode yang dimodifikasi tetapi dengan perbaikan bug karena tidak menyebabkan kesalahan pada postback sesi yang kadaluwarsa / tidak valid. Untuk melihat apakah ini masalah dengan situs Anda saat ini, buka formulir Anda di jendela dan sesaat sebelum Anda mengklikSave
atauPublish
, buka jendela duplikat, dan logout. Sekarang kembali ke jendela pertama Anda dan coba kirim formulir Anda menggunakan salah satu tombol. Bagi saya, saya mendapatkan kesalahan sehingga perubahan ini menyelesaikan masalah itu untuk saya. Saya menghilangkan banyak barang demi singkatnya tetapi Anda harus mendapatkan ide. Bagian-bagian kuncinya adalah penyertaanActionName
pada atribut dan memastikan nama yang diberikan adalah nama Tampilan yang menunjukkan formulirKelas Atribut
Pengendali
Melihat
sumber
Pendekatan JQuery saya menggunakan metode ekstensi:
Anda bisa menggunakannya seperti ini:
Dan itu merender seperti ini:
sumber
Untuk setiap tombol kirim cukup tambahkan:
sumber
Berdasarkan jawaban mkozicki saya datang dengan solusi yang sedikit berbeda. Saya masih menggunakan
ActionNameSelectorAttribute
Tapi saya harus menangani dua tombol 'Simpan' dan 'Sinkronisasi'. Mereka melakukan hal yang hampir sama sehingga saya tidak ingin melakukan dua tindakan.atribut :
melihat
pengontrol
Saya juga ingin menunjukkan bahwa jika tindakan melakukan hal yang berbeda, saya mungkin akan mengikuti pos mkozicki.
sumber
Saya telah membuat metode ActionButton untuk HtmlHelper . Ini akan menghasilkan tombol input normal dengan sedikit javascript di acara OnClick yang akan mengirimkan formulir ke Controller / Action yang ditentukan.
Anda menggunakan pembantu seperti itu
ini akan menghasilkan HTML berikut
Berikut adalah kode metode ekstensi:
VB.Net
C # (kode C # baru didekompilasi dari VB DLL, sehingga bisa mendapatkan sedikit keindahan ... tetapi waktunya sangat singkat :-))
Metode ini memiliki berbagai parameter, tetapi untuk kemudahan penggunaan Anda dapat membuat beberapa kelebihan yang hanya mengambil parameter yang Anda butuhkan.
sumber