ASP.NET MVC - получить текущий контроллер и имя действия в помощнике

Я пытаюсь создать пользовательский помощник HTML, который будет извлекать текст из файла XML и отображать его в представлении. XML организован в иерархию, где верхние узлы представляют имена контроллеров, следующие за именами действий, а затем отдельными ключами.

Цель состоит в том, чтобы выполнить синтаксис, такой как:

@Html.Show("Title")

Где помощник будет выводить имя контроллера и имя действия из представления, где он был вызван.

Есть ли способ получить эту информацию в методе расширения вспомогательный HTML?

3 ответа

Решение

Вы можете получить текущий контроллер и действие из htmlHelper.ViewContext.RouteData, Используйте метод расширения ниже, чтобы получить соответствующее значение из xml:

//make sure you include System.Xml.XPath, otherwise extension methods for XPath 
//won't be available
using System.Xml.XPath;

public static MvcHtmlString Show(this HtmlHelper htmlHelper,
                                                 string key)
{
    XElement element = XElement.Load("path/to/yourXmlfile.xml");
    RouteData routeData = htmlHelper.ViewContext.RouteData;
    var keyElement = element.XPathSelectElements(string.format("//{0}/{1}/{2}", 
                                                    routeData.GetRequiredString("controller"), 
                                                    routeData.GetRequiredString("action"), 
                                                    key)
                                                ).FirstOrDefault();

    if (keyElement == null)
        throw new ApplicationException(
            string.format("key: {0} is not defined in xml file", key));

    return new MvcHtmlString(keyElement.Value);
}

Еще проще:

htmlHelper.ViewContext.RouteData.Values["controller"] 

а также

htmlHelper.ViewContext.RouteData.Values["action"] 

дает вам имя контроллера и действия, соответственно.

Вот название действия:

ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString()
Другие вопросы по тегам