我在两个单独的页面上使用局部视图,部分视图使用元数据以模型上的属性形式获取显示名称(标准的元数据方式)。
我需要根据页面使显示名称上下文敏感。
为此,我正在扩展System.ComponentModel.DisplayNameAttribute并传入一个area / controller / action / resourcefile / resourcestring数组,以便我可以根据上下文选择正确的资源字符串。
我的问题是如何从以下区域获取区域/控制器/动作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonInterfaces.Helpers;
namespace CommonInterfaces.ComponentModel
{
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class ContextSensitiveDisplayName : System.ComponentModel.DisplayNameAttribute
{
public class Context
{
public string Area { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
public Type ResourceType { get; set; }
public string ResourceKey { get; set; }
public Context(string area, string controller, string action, Type resourceType, string resourceKey)
{
this.Area = area;
this.Controller = controller;
this.Action = action;
this.ResourceType = resourceType;
this.ResourceKey = resourceKey;
}
}
public ContextSensitiveDisplayName(params Context[] contexts)
{
/* Its these values that I need */
string currentArea = "";
string currentController = "";
string currentAction = "";
Context selectedContext =
contexts.FirstOrDefault(m =>
(m.Area == currentArea) &&
(m.Controller == currentController) &&
(m.Action == currentAction)
);
this.DisplayNameValue = ""; // Use the selectContext to retrieve string from resource file.
}
}
}
对此的任何帮助将不胜感激。
答案 0 :(得分:1)
这有点讨厌,但应该有效:
if(HttpContext.Current != null && HttpContext.Current.Handler is System.Web.Mvc.MvcHandler)
{
var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler;
var controller = handler.RequestContext.RouteData.Values["controller"];
var action = handler.RequestContext.RouteData.Values["action"];
}
答案 1 :(得分:1)
我最后用过这个。
var routingValues = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current)).Values;
string currentArea = (string)routingValues["area"] ?? string.Empty;
string currentController = (string)routingValues["controller"] ?? string.Empty;
string currentAction = (string)routingValues["action"] ?? string.Empty;
我要尝试Jakub Konecki的答案,然后才能将其标记为正确的答案 - 他的外观在使用空检查时更加强大。我很快就会接受这个。
答案 2 :(得分:-1)
你不是。在知道路由的上下文中不创建属性实例。您无法在属性中执行此操作。
此信息也不是DefaultModelBinder
传递给元数据提供者的,因此编写自定义元数据提供程序不会有帮助,除非您还编写自定义模型绑定程序。恕我直言,这是太多的工作。
我建议使用不同的视图模型。