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?

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.


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.


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");

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?


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" });

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 ...


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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.