Dapatkan pengontrol saat ini dalam tampilan

127

Saya memiliki View - _Edityang tinggal diNews M/V/C .

Saya menggunakan kembali V/Mvia CategoryControllersebagai:

return PartialView("/Views/News/_Edit.cshtml", model);

Bagaimana dari dalam View - _Editsaya bisa memberitahukan nama pengontrol?

Ketika saya:

alert('@ViewContext. RouteData.Values["controller"].ToString()');

Nilainya adalah: News Namun, URL-nya adalah:/Category/foobar

Apakah ada cara untuk mendapatkan nilai 'Category'untuk mengingatkan? Terima kasih

Valamas
sumber
kamu tidak punya NewsController?
pemburu
Silakan kirim tindakan Anda methodyang memuat partialviewdan apa controlleryang methodada di.
hunter

Jawaban:

193

Saya telah menempatkan ini dalam pandangan sebagian saya:

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()

dalam situasi yang sama seperti yang Anda jelaskan, dan itu menunjukkan pengontrol yang dijelaskan dalam URL (Kategori untuk Anda, Produk untuk saya), alih-alih lokasi sebenarnya dari tampilan sebagian.

Jadi, gunakan lansiran ini sebagai gantinya:

alert('@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()');
Nicholas Sizer
sumber
25
Jawaban di bawah oleh Palpie adalah jalan pintas (lebih mudah diingat):@ViewContext.RouteData.Values["controller"]
Laoujin
6
Hanya fyi, kamu tidak perlu mendapatkannya HttpContext.Current. Requesttersedia langsung.
Serj Sagan
Apakah mungkin untuk mendapatkan nama kelas kontroler penuh termasuk namespace? Juga akan keren untuk juga dapat menampilkan nama tampilan.
Johncl
3
btw, ["action"]berfungsi jika Anda ingin nama metode tindakan.
Zapnologica
117

Saya melakukannya seperti ini, tapi mungkin itu hanya ASP.NET MVC 4

@ViewContext.RouteData.Values["controller"]
Peter Hedberg
sumber
12
Ingatlah bahwa solusi Anda akan mengembalikan pengontrol yang saat ini sedang dijalankan. Oleh karena itu, jika browser membuat permintaan untuk ControllerA, dan ControllerA membuat sebagian tampilan dari ControllerB, solusi Anda akan mengembalikan nama ControllerB, sementara solusi Nicholas Sizer akan mengembalikan nama ControllerA.
Thomas CG de Vilhena
Harus diterima sebagai jawaban terbaik. Ini masih bekerja di ASP.NET Core 2.2
Tom
21

Buat kelas dasar untuk semua pengontrol dan letakkan di sini nama atribut:

public abstract class MyBaseController : Controller
{
    public abstract string Name { get; }
}

Dalam penglihatan

@{
    var controller = ViewContext.Controller as MyBaseController;
    if (controller != null)
    {
       @controller.Name
    }
}

Contoh pengontrol

 public class SampleController: MyBaseController 
    { 
      public override string Name { get { return "Sample"; } 
    }
Sel
sumber
Tolong jelaskan bagaimana Nameproperti diatur?
ErikE
13

Cara lain untuk mendapatkan nama Pengendali saat ini di Tampilan

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Vladimir Savinov
sumber
5

Cukup gunakan:

ViewContext.Controller.GetType().Name

Ini akan memberi Anda seluruh Nama Pengendali

batspy
sumber
2

Anda masih dalam konteks Anda CategoryControllermeskipun Anda sedang memuat PartialViewdari Views/Newsfolder Anda .

pemburu
sumber
0

Anda dapat menggunakan salah satu kode di bawah ini untuk mendapatkan nama controller

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

Jika Anda menggunakan MVC 3, Anda dapat menggunakan

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Sathish
sumber