Jawaban:
Gunakan ViewContext
dan lihat RouteData
koleksi untuk mengekstrak elemen controller dan action. Tapi saya pikir pengaturan beberapa variabel data yang menunjukkan konteks aplikasi (misalnya, "mode edit" atau "kesalahan") daripada pengontrol / tindakan mengurangi sambungan antara tampilan dan pengontrol Anda.
Dalam RC Anda juga dapat mengekstrak data rute seperti nama metode tindakan seperti ini
ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue
ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]
ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
variasi +
Untuk mendapatkan Id saat ini pada Tampilan:
ViewContext.RouteData.Values["id"].ToString()
Untuk mendapatkan pengontrol saat ini:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
dulu.
Saya tahu ini adalah pertanyaan yang lebih lama, tetapi saya melihatnya dan saya pikir Anda mungkin tertarik pada versi alternatif daripada membiarkan pandangan Anda menangani mengambil data yang diperlukan untuk melakukan pekerjaan itu.
Cara yang lebih mudah menurut saya adalah mengganti metode OnActionExecuting . Anda melewati ActionExecutingContext yang berisi anggota ActionDescriptor yang dapat Anda gunakan untuk mendapatkan informasi yang Anda cari, yang merupakan ActionName dan Anda juga dapat mencapai ControllerDescriptor dan berisi ControllerName.
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
ActionDescriptor actionDescriptor = filterContext.ActionDescriptor;
string actionName = actionDescriptor.ActionName;
string controllerName = actionDescriptor.ControllerDescriptor.ControllerName;
// Now that you have the values, set them somewhere and pass them down with your ViewModel
// This will keep your view cleaner and the controller will take care of everything that the view needs to do it's job.
}
Semoga ini membantu. Jika ada, setidaknya itu akan menunjukkan alternatif bagi orang lain yang datang dengan pertanyaan Anda.
Saya melihat jawaban yang berbeda dan menghasilkan pembantu kelas:
using System;
using System.Web.Mvc;
namespace MyMvcApp.Helpers {
public class LocationHelper {
public static bool IsCurrentControllerAndAction(string controllerName, string actionName, ViewContext viewContext) {
bool result = false;
string normalizedControllerName = controllerName.EndsWith("Controller") ? controllerName : String.Format("{0}Controller", controllerName);
if(viewContext == null) return false;
if(String.IsNullOrEmpty(actionName)) return false;
if (viewContext.Controller.GetType().Name.Equals(normalizedControllerName, StringComparison.InvariantCultureIgnoreCase) &&
viewContext.Controller.ValueProvider.GetValue("action").AttemptedValue.Equals(actionName, StringComparison.InvariantCultureIgnoreCase)) {
result = true;
}
return result;
}
}
}
Jadi dalam Tampilan (atau master / tata letak) Anda dapat menggunakannya seperti itu (Sintaks Razor):
<div id="menucontainer">
<ul id="menu">
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home", "index", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("Home", "Index", "Home")</li>
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("account","logon", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("Logon", "Logon", "Account")</li>
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home","about", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("About", "About", "Home")</li>
</ul>
</div>
Semoga ini bisa membantu.
Anda bisa mendapatkan data ini dari RouteData dari ViewContext
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
Di MVC Anda harus memberikan View dengan semua data, jangan biarkan View mengumpulkan datanya sendiri sehingga yang dapat Anda lakukan adalah mengatur kelas CSS dalam aksi controller Anda.
ViewData["CssClass"] = "bold";
dan pilih nilai ini dari ViewData Anda di View Anda
Saya memilih 2 ini:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
dan
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Anda dapat mengambil kembali nama fisik tampilan saat ini dan tindakan yang memicunya. Ini dapat berguna di sebagian * halaman .acmx untuk menentukan wadah host.
Memperluas jawaban Dale Ragan , contohnya untuk digunakan kembali, membuat kelas ApplicationController yang berasal dari Controller, dan pada gilirannya memiliki semua controller Anda yang lain berasal dari kelas ApplicationController daripada Controller.
Contoh:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
Di ApplicationController baru Anda, buat properti bernama ExecutingAction dengan tanda tangan ini:
protected ActionDescriptor ExecutingAction { get; set; }
Dan kemudian dalam metode OnActionExecuting (dari jawaban Dale Ragan), cukup tetapkan ActionDescriptor ke properti ini dan Anda dapat mengaksesnya kapan pun Anda membutuhkannya di salah satu pengontrol Anda.
string currentActionName = this.ExecutingAction.ActionName;
Ganti fungsi ini di controller Anda
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}