Câu trả lời:
Sử dụng ViewContext
và nhìn vào RouteData
bộ sưu tập để trích xuất cả bộ điều khiển và các yếu tố hành động. Nhưng tôi nghĩ rằng việc thiết lập một số biến dữ liệu cho biết bối cảnh ứng dụng (ví dụ: "chỉnh sửa mã" hoặc "lỗi") thay vì bộ điều khiển / hành động làm giảm sự ghép nối giữa các khung nhìn và bộ điều khiển của bạn.
Trong RC, bạn cũng có thể trích xuất dữ liệu tuyến đường như tên phương thức hành động như thế này
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
+ các biến thể
Để nhận Id hiện tại trên Chế độ xem:
ViewContext.RouteData.Values["id"].ToString()
Để có được bộ điều khiển hiện tại:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
trước.
Tôi biết đây là một câu hỏi cũ hơn, nhưng tôi đã thấy nó và tôi nghĩ rằng bạn có thể quan tâm đến một phiên bản thay thế hơn là để cho chế độ xem của bạn xử lý lấy dữ liệu cần thiết để thực hiện công việc đó.
Theo tôi, một cách dễ dàng hơn là ghi đè phương thức OnActionExecuting . Bạn được thông qua ActionExecutingContext có chứa thành viên ActionDescriptor mà bạn có thể sử dụng để lấy thông tin mà bạn đang tìm kiếm, đó là ActionName và bạn cũng có thể truy cập Trình điều khiển và nó có chứa Trình điều khiển.
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.
}
Hi vọng điêu nay co ich. Nếu bất cứ điều gì, ít nhất nó sẽ hiển thị một thay thế cho bất kỳ ai khác đến bằng câu hỏi của bạn.
Tôi thấy các câu trả lời khác nhau và đưa ra một người trợ giúp lớp:
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;
}
}
}
Vì vậy, trong Chế độ xem (hoặc chính / bố cục), bạn có thể sử dụng nó như vậy (Cú pháp dao động):
<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>
Hy vọng nó giúp.
Bạn có thể lấy những dữ liệu này từ RouteData của ViewContext
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
Trong MVC, bạn nên cung cấp cho View tất cả dữ liệu, không để View thu thập dữ liệu của chính nó, vì vậy điều bạn có thể làm là đặt lớp CSS trong hành động điều khiển của bạn.
ViewData["CssClass"] = "bold";
và chọn ra giá trị này từ ViewData trong Chế độ xem của bạn
Tôi bỏ phiếu cho 2:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
và
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Bạn có thể truy xuất cả tên vật lý của chế độ xem hiện tại và hành động đã kích hoạt nó. Nó có thể hữu ích trong các trang * .acmx một phần để xác định vùng chứa máy chủ.
Mở rộng câu trả lời của Dale Ragan , ví dụ của anh ta để tái sử dụng, tạo một lớp ApplicationContoder xuất phát từ Trình điều khiển và đến lượt tất cả các bộ điều khiển khác của bạn xuất phát từ lớp ApplicationContoder đó thay vì Trình điều khiển.
Thí dụ:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
Trên ApplicationContoder mới của bạn tạo một thuộc tính có tên ExecutingAction với chữ ký này:
protected ActionDescriptor ExecutingAction { get; set; }
Và sau đó, trong phương thức OnActionExecuting (từ câu trả lời của Dale Ragan), chỉ cần gán ActionDescriptor cho thuộc tính này và bạn có thể truy cập nó bất cứ khi nào bạn cần trong bất kỳ bộ điều khiển nào.
string currentActionName = this.ExecutingAction.ActionName;
Ghi đè chức năng này trong bộ điều khiển của bạn
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}