Saya perlu memanggil action B controller FileUploadMsgView dari Controller A dan perlu melewati parameter untuk itu.
Code---its not going to the controller B's FileUploadMsgView().
In ControllerA
private void Test()
{
try
{//some codes here
ViewBag.FileUploadMsg = "File uploaded successfully.";
ViewBag.FileUploadFlag = "2";
RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" });
}
In ControllerB receiving part
public ActionResult FileUploadMsgView(string FileUploadMsg)
{
return View();
}
c#
asp.net-mvc
asp.net-mvc-4
pengguna2156088
sumber
sumber
Jawaban:
Pengendali hanya kelas - yang baru dan memanggil metode tindakan seperti Anda akan anggota kelas lainnya:
var result = new ControllerB().FileUploadMsgView("some string");
sumber
var controller = DependencyResolver.Current.GetService<ControllerB>();
Seperti @mxmissile mengatakan di komentar untuk jawaban yang diterima, Anda tidak boleh baru membuat controller karena dependensi akan hilang yang diatur untuk IoC dan tidak akan memilikinya
HttpContext
.Sebagai gantinya, Anda harus mendapatkan instance pengontrol Anda seperti ini:
sumber
HttpContext
suntikan.var controller
akan diberikan tipeControllerB
, ya.HttpContext
). Saya percaya saya menggunakan pendekatan ini tanpa IoC untuk mendapatkan objek kontroler "dangkal" (hanya perlu akses ke fungsi tertentu) dan pada awalnya bingung tentang mengapa bagian-bagian "hilang". [samping: Saya mengatasinya saat masih menggunakan pendekatan ini, tetapi mungkin seharusnya refactored fungsionalitas itu ke kelas bersama.] Adapun pengaturan dan pilihan IoC, saya harus merujuk Anda ke artikel lain / pertanyaan SO.Sampel Anda terlihat seperti kode psuedo. Anda harus mengembalikan hasil
RedirectToAction
:sumber
seperti @DLeh mengatakan Gunakan saja
Tetapi, memberikan controller, konteks controller adalah penting terutama ketika Anda perlu mengakses
User
objek,Server
objek, atau diHttpContext
dalam controller 'child'.Saya telah menambahkan sederet kode:
atau Anda bisa menggunakan System.Web untuk mengakses konteks saat ini juga, untuk mengakses
Server
atau objek metion awalNB: saya menargetkan kerangka kerja versi 4.6 (Mvc5)
sumber
controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";
Dengan asumsi Anda mencoba mengembalikan hasil dari tindakan Indeks di HomeController.this
daripadacontroller
. Pada akhirnya hasilnya kembali melalui pengontrol lokal (ini) sehingga itulah yang akhirnya mencoba menemukan tampilan.return View("ViewName");
sebagai gantinya hanyareturn View();
Biarkan resolver secara otomatis melakukan itu.
Di dalam controller:
sumber
Jika ada yang melihat bagaimana melakukan ini dalam. Net core saya menyelesaikannya dengan menambahkan controller di startup
Kemudian Menyuntikkannya ke pengontrol lain
Kemudian panggil saja seperti itu
_myControllerIwantToInject.MyMethodINeed();
sumber
Inilah yang saya cari setelah menemukan yang
RedirectToAction()
tidak akan melewati objek kelas yang kompleks.Sebagai contoh, saya ingin memanggil
IndexComparison
metode diLifeCycleEffectsResults
controller dan memberikannya objek model kelas bernama kompleks.Berikut adalah kode yang gagal:
Perlu dicatat adalah bahwa Strings, integer, dll selamat dari perjalanan ke metode controller ini, tetapi objek daftar generik menderita dari apa yang mengingatkan pada kebocoran memori C.
Seperti yang disarankan di atas, inilah kode yang saya ganti dengan:
Semua berfungsi sebagaimana dimaksud sekarang. Terima kasih telah memimpin.
sumber
Jawaban Dleh benar dan menjelaskan cara mendapatkan turunan dari pengontrol lain tanpa kehilangan dependensi yang diatur untuk IoC
Namun, kita sekarang perlu memanggil metode dari pengontrol lain ini.
Jawaban lengkapnya adalah:
sumber
Saya tahu ini sudah tua, tetapi Anda dapat:
sumber
jika masalahnya adalah menelepon. Anda dapat memanggilnya menggunakan metode ini.
sumber
var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));