Menampilkan tampilan dari pengontrol lain di ASP.NET MVC

248

Apakah mungkin untuk menampilkan tampilan dari pengontrol lain?

Katakan misalnya saya punya CategoriesControllerdan Category/NotFound.aspxmelihat. Sementara di CategoriesController, saya dapat dengan mudah kembali View("NotFound").

Sekarang katakan saya punya ProductsControllerdan tindakan dan pandangan untuk menambahkan produk. Namun, tindakan ini mengharuskan kami memiliki Kategori untuk menambahkan Produk. Sebagai contoh Products/Add/?catid=10,.

Jika saya tidak dapat menemukan Kategori berdasarkan catid, saya ingin menunjukkan NotFoundtampilan dari pengontrol Kategori alih-alih membuat CategoryNotFoundtampilan di bawah pengontrol Produk.

Apakah ini mungkin atau apakah saya menyusun sesuatu dengan cara yang salah? Apakah ada cara yang baik untuk melakukan ini?

dtc
sumber

Jawaban:

283

Iya. Secara default, ASP.NET MVC memeriksa pertama kali \Views\[Controller_Dir]\, tetapi setelah itu, jika tidak menemukan tampilan, itu masuk \Views\Shared.

Direktori bersama ada di sana secara khusus untuk membagikan Tampilan di banyak pengontrol. Cukup tambahkan View Anda ke subdirektori Shared dan Anda siap melakukannya.

Jika Anda melakukannya, return View("~/Views/Wherever/SomeDir/MyView.aspx")Anda dapat mengembalikan tampilan yang Anda inginkan.

womp
sumber
Terima kasih, ini sepertinya solusi yang harus saya gunakan. Saya masih bertanya-tanya apakah mungkin untuk menampilkan Tampilan dari pengontrol lain. Saya kira ini melanggar beberapa aturan di MVC?
dtc
1
Dalam situasi yang Anda jelaskan di atas, ya, Anda harus menggunakan folder Bersama.
Jonathan Freeland
69
Yap, itu juga mungkin. Jika Anda mengembalikan View ("~ / Views / Wherever / SomeDir / MyView.aspx") Anda dapat mengembalikan View yang Anda inginkan. Ini tidak melanggar aturan khusus apa pun, namun ASP.Net MVC adalah semua tentang "konvensi atas kongfigurasi". Dengan kata lain, kerangka kerja dibangun untuk beroperasi secara otomatis menggunakan konvensi tertentu, dan Anda harus menggunakannya jika memungkinkan.
Womp
1
Terima kasih atas penjelasannya. Saya tidak tahu Tampilan bisa disebut seperti itu. Shared direktori tentu saja bekerja sempurna :)
dtc
1
Saya tidak berada di Kontroler, jadi saya harus menggunakan new ViewResult { ViewName = "~/Views/Error/Unauthorised.cshtml" };dan itu berhasil
Nacht
162

Kamu bisa memakai:

return View("../Category/NotFound", model);

Itu diuji dalam ASP.NET MVC 3, tetapi juga harus bekerja di ASP.NET MVC 2.

Guillaume86
sumber
3
Bekerja di MVC 2, dan ternyata menjadi solusi terbersih untuk situasi yang tidak biasa yang saya hadapi.
Todd Menier
3
Resharper akan melaporkan tautan itu sebagai kesalahan tetapi masih berfungsi.
CodeMonkeyKing
1
@CodeMonkeyKing - Resharper 7 (dalam VS2012) dengan benar mengidentifikasi jalur yang diformat sebagai "~/Views/Category/NotFound.cshtml".
Richard Ev
Perlu dicatat: solusi ini berfungsi dengan mode tampilan, misalnya jika Anda memiliki tampilan "/Category/NotFound.Mobile.cshtml".
BenWillkommen
55

Iya itu mungkin. Kembalikan RedirectToAction()metode seperti ini:

return RedirectToAction("ActionOrViewName", "ControllerName");
doncadavona
sumber
1
Saya percaya ini harus pergi sebagai RedirectToAction ("ActionOrView", "Controller", null) karena jika tidak paramater kedua adalah routeValues
Zoran P.
Tetapi dalam kasus ini, Anda harus benar-benar menulis aksi di controller, tidak seperti dengan solusi View.
tobbenb3
@ tobbenb3 Itu solusi yang jauh lebih baik daripada hasil hardcoding. Bagaimanapun Anda tidak harus melewati string path.
perustaja
34

Sudahkah Anda mencoba RedirectToAction?

Paul Johnson
sumber
1
Saya akan mengatakan bahwa ini adalah MVC untuk siapa pun yang tidak ingin tampilan int ia berbagi folder, perhatikan bahwa untuk semua solusi lain (seperti menggunakan jalur langsung) siapa pun yang mencoba faktor ulang pandangan tidak harus mempertimbangkan bahwa itu juga digunakan di pengontrol lain, menghasilkan perilaku yang tidak terduga
yoel halb
4
bagaimana tanpa mengarahkan?
Luckyy
solusi yang jauh lebih baik daripada memindahkan tampilan ke folder bersama
juFo
Solusi ini memerlukan tindakan pada controller, View (directPath) membuat output tanpa tindakan apa pun. Ketika Anda menambahkan tindakan, Anda harus berpikir untuk menyembunyikannya dari akses langsung melalui url, itu akan menghasilkan langkah dalam riwayat browser dll. Tapi ya, itu cara saya untuk pergi.
Jan Zahradník
3
RedirectToAction mengirimkan kode respons 302 ke browser. Itu tidak tepat ketika Anda mencoba untuk menunjukkan halaman 404 tidak ditemukan. Artinya, solusi ini tampaknya berfungsi tetapi akan membingungkan mesin pencari.
NightOwl888
20

Ya kamu bisa. Kembalikan Tindakan seperti ini:

return RedirectToAction("View", "Name of Controller");

Sebuah contoh:

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

Pendekatan ini akan memanggil metode GET

Anda juga dapat meneruskan nilai ke tindakan seperti ini:

return RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" });
ignacio chiazzo
sumber
bagaimana saya mengirim objek dengan pendekatan ini?
Djeroen
Lihatlah @Djeroen
ignacio chiazzo
5
Anda tidak mengembalikan tampilan, Anda memanggil tindakan.
0014
Di atas semua itu membantu saya.
anil shrestha
5

Anda juga dapat memanggil pengontrol apa saja dari JavaScript / jQuery . Katakanlah Anda memiliki controller yang mengembalikan 404 atau halaman / kontrol pengguna lain. Kemudian, pada beberapa tindakan, dari kode klien Anda, Anda dapat memanggil beberapa alamat yang akan memecat controller Anda dan mengembalikan hasilnya dalam format HTML kode klien Anda dapat mengambil hasil yang dikembalikan ini dan meletakkannya di mana pun Anda inginkan di halaman Anda ...

Marko
sumber
Saya tidak tahu hal itu. Kedengarannya itu sesuatu yang mungkin saya gunakan di masa depan. Ya, mvc rocks :)
dtc
1

Dengan kode ini Anda dapat memperoleh pengontrol apa saja:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);
Yair GR
sumber
Terjemahan: Dengan kode ini Anda dapat memperoleh kontroler apa pun: [kode], Salam,
Robert Columbia
3
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Nic3500