ASP.NET MVC보기에서 현재 작업을 어떻게 반환 할 수 있습니까?
현재 컨트롤러 및 작업에 따라 마스터 페이지에서 CSS 클래스를 설정하고 싶었습니다. 나는 통해 현재 컨트롤러에 얻을 수 ViewContext.Controller.GetType().Name
있지만, 어떻게 (예를 들어, 현재 조치를받을 수 있나요 Index
, Show
등)?
사용 ViewContext
상기와 모양을 RouteData
컨트롤러와 액션 요소 모두를 추출하는 모음입니다. 그러나 컨트롤러 / 액션 대신 애플리케이션 컨텍스트 (예 : "editmode"또는 "error")를 나타내는 일부 데이터 변수를 설정하면 뷰와 컨트롤러 간의 연결이 줄어 듭니다.
RC에서는 다음과 같이 동작 메소드 이름과 같은 경로 데이터를 추출 할 수도 있습니다.
ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue
MVC 3 업데이트
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue
MVC 4 업데이트
ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]
MVC 4.5 업데이트
ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]
뷰에서 현재 ID를 얻으려면 :
ViewContext.RouteData.Values["id"].ToString()
현재 컨트롤러를 얻으려면 :
ViewContext.RouteData.Values["controller"].ToString()
나는 이것이 오래된 질문이라는 것을 알고 있지만 그것을 보았고보기가 처리하는 데 필요한 데이터를 검색하도록 처리하는 것보다 대체 버전에 관심이 있다고 생각했습니다.
내 의견으로는 더 쉬운 방법은 OnActionExecuting 메서드 를 재정의하는 것입니다. 찾고있는 정보를 얻는 데 사용할 수 있는 ActionDescriptor 멤버 ( ActionName) 가 포함 된 ActionExecutingContext 가 전달되며 ControllerDescriptor에 도달 할 수 있으며 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.
}
도움이 되었기를 바랍니다. 적어도 무엇이든, 그것은 당신의 질문에 의해 오는 다른 누군가를위한 대안을 보여줄 것입니다.
나는 다른 답변을보고 수업 도우미를 생각해 냈습니다.
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;
}
}
}
따라서 View (또는 master / layout)에서 다음과 같이 사용할 수 있습니다 (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>
도움이 되길 바랍니다.
ViewContext의 RouteData에서 이러한 데이터를 얻을 수 있습니다.
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
MVC에서는 View에 모든 데이터를 제공해야하며 View에서 자체 데이터를 수집하지 않도록해야합니다. 컨트롤러 작업에서 CSS 클래스를 설정하는 것이 가능합니다.
ViewData["CssClass"] = "bold";
View의 ViewData에서이 값을 선택하십시오.
나는 이것을 2 투표 :
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
과
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
현재보기의 실제 이름과이를 트리거 한 조치를 모두 검색 할 수 있습니다. 부분 * .acmx 페이지에서 호스트 컨테이너를 결정하는 데 유용 할 수 있습니다.
ASP.NET MVC 4를 사용하고 있으며 이것이 나를 위해 일한 것입니다.
ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue
ControllerContext.Controller.ValueProvider.GetValue("action").RawValue
재사용을위한 그의 예인 Dale Ragan의 답변을 확장 하여 Controller에서 파생되는 ApplicationController 클래스를 만들고 다른 모든 컨트롤러가 Controller가 아닌 해당 ApplicationController 클래스에서 파생되도록합니다.
예:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
새 ApplicationController에서이 서명으로 ExecutingAction이라는 특성을 작성하십시오.
protected ActionDescriptor ExecutingAction { get; set; }
그런 다음 Dale Ragan의 답변에서 온 OnActionExecuting 메서드에서 ActionDescriptor를이 속성에 지정하면 컨트롤러에서 필요할 때마다 액세스 할 수 있습니다.
string currentActionName = this.ExecutingAction.ActionName;
컨트롤러에서이 기능을 재정의
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}
'Programing' 카테고리의 다른 글
로컬 JSON 파일로드 (0) | 2020.03.19 |
---|---|
C #의 디렉토리에있는 모든 파일을 재귀 적으로 나열하는 방법은 무엇입니까? (0) | 2020.03.19 |
포함 된 저장 프로 시저를 찾으려면 어떻게합니까 (0) | 2020.03.19 |
가장 유용한 Intellij IDEA 키보드 단축키는 무엇입니까? (0) | 2020.03.19 |
PHP를 사용하여 이메일을 보내는 방법은 무엇입니까? (0) | 2020.03.18 |