MVC2 найти область / контроллер / действие из пользовательского атрибута - PullRequest
1 голос
/ 07 января 2011

Я использую частичное представление на двух отдельных страницах, а частичное представление использует метаданные для получения отображаемых имен в форме атрибутов в модели (стандартный способ выполнения метаданных).

Мне нужносделать контекст отображаемого имени чувствительным в зависимости от страницы.

С этой целью я расширяю атрибут System.ComponentModel.DisplayNameAttribute и передаю массив области / 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.
        }
    }
}

Любая помощь с этим будет принята с благодарностью,

Ответы [ 3 ]

1 голос
/ 07 января 2011

Это немного противно, но должно работать:

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 голос
/ 14 января 2011

Я использовал это в конце.

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;

Я собираюсь опробовать ответ Якуба Конецки, прежде чем пометить его как правильный - он выглядит немного более устойчивым с нулевыми проверками и прочим.Я скоро вернусь к этому.

0 голосов
/ 07 января 2011

Ты не.Экземпляры атрибутов не создаются в контексте, который знает маршрут.Вы не можете сделать это в атрибуте.

Также эта информация не передается поставщику метаданных с помощью DefaultModelBinder, поэтому написание собственного поставщика метаданных не поможет, если вы также не напишите пользовательское связующее для модели.Что слишком много работы ИМХО.

Я бы предложил использовать разные модели просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...