รับตัวควบคุมปัจจุบันในมุมมอง


127

ฉันมีView - _Editที่อาศัยอยู่News M/V/Cที่อาศัยอยู่ใน

ฉันใช้ซ้ำV/Mผ่านทางCategoryControlleras:

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

ฉันView - _Editจะแจ้งเตือนชื่อคอนโทรลเลอร์จากภายในได้อย่างไร?

เมื่อฉัน:

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

ค่าคือ: News อย่างไรก็ตาม URL คือ:/Category/foobar

มีวิธีรับค่า'Category'เพื่อแจ้งเตือนหรือไม่? ขอบคุณ


คุณไม่มีNewsController?
นักล่า

โปรดโพสต์การกระทำของคุณmethodที่กำลังโหลดpartialviewและสิ่งcontrollerที่methodมีอยู่
นักล่า

คำตอบ:


193

ฉันใส่สิ่งนี้ไว้ในมุมมองบางส่วนของฉัน:

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

ในสถานการณ์เดียวกันกับที่คุณอธิบายและจะแสดงตัวควบคุมที่อธิบายไว้ใน URL (หมวดหมู่สำหรับคุณผลิตภัณฑ์สำหรับฉัน) แทนตำแหน่งจริงของมุมมองบางส่วน

ดังนั้นใช้การแจ้งเตือนนี้แทน:

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

25
คำตอบด้านล่างของ Palpie คือทางลัด (จำง่ายกว่า):@ViewContext.RouteData.Values["controller"]
Laoujin

6
เพียง FYI HttpContext.Currentคุณไม่จำเป็นต้องได้รับ Requestสามารถใช้ได้โดยตรง
Serj Sagan

เป็นไปได้หรือไม่ที่จะรับชื่อคลาสคอนโทรลเลอร์แบบเต็มรวมทั้งเนมสเปซ นอกจากนี้ยังเป็นการดีที่สามารถแสดงชื่อมุมมองได้ด้วย
Johncl

3
btw ใช้["action"]งานได้ถ้าคุณต้องการชื่อของวิธีการดำเนินการ
Zapnologica

117

ฉันทำแบบนี้ แต่บางทีอาจเป็นเพียง ASP.NET MVC 4

@ViewContext.RouteData.Values["controller"]

12
โปรดทราบว่าโซลูชันของคุณจะส่งคืนคอนโทรลเลอร์ที่กำลังดำเนินการอยู่ ดังนั้นหากเบราว์เซอร์ส่งคำขอ ControllerA และ ControllerA แสดงมุมมองบางส่วนจาก ControllerB โซลูชันของคุณจะส่งคืนชื่อ ControllerB ในขณะที่โซลูชัน Nicholas Sizer จะส่งคืนชื่อของ ControllerA
Thomas CG de Vilhena

ควรยอมรับว่าเป็นคำตอบที่ดีที่สุด. สิ่งนี้ยังใช้งานได้ใน ASP.NET Core 2.2
Tom

21

สร้างคลาสพื้นฐานสำหรับคอนโทรลเลอร์ทั้งหมดและใส่แอตทริบิวต์ชื่อที่นี่:

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

ในมุมมอง

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

ตัวอย่างคอนโทรลเลอร์

 public class SampleController: MyBaseController 
    { 
      public override string Name { get { return "Sample"; } 
    }

กรุณาอธิบายวิธีการNameตั้งค่าคุณสมบัติ?
ErikE


5

เพียงใช้:

ViewContext.Controller.GetType().Name

สิ่งนี้จะให้ชื่อผู้ควบคุมทั้งหมดแก่คุณ


2

คุณยังคงอยู่ในบริบทของคุณCategoryControllerแม้ว่าคุณจะโหลดไฟล์PartialViewจากViews/Newsโฟลเดอร์ของคุณก็ตาม


0

คุณสามารถใช้รหัสใดก็ได้ด้านล่างเพื่อรับชื่อคอนโทรลเลอร์

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

หากคุณใช้ MVC 3 คุณสามารถใช้

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.