Самый простой способ доступа к RouteData.Values из представления
Я использую следующий код, чтобы получить текущее "действие" в моем представлении, потому что я хочу настроить сборку actionlink на основе этого.
ViewContext.RequestContext.RouteData.Values("action")
Моя конечная цель - создать некоторые ссылки на действия с Javascript, а .js должно знать, что представляет собой текущий контроллер и действие, так как я бы хотел, чтобы он был гибким. Я нашел выше, просматривая фреймворк, но не знаю, нашел ли я правильную вещь.
то есть.
var routeData = ViewContext.RequestContext.RouteData;
var linkStub = '/@routeData.Values("controller")/@routeData.Values("action")';
Кто-нибудь знает, если это самый простой/самый простой способ сделать это?
Ответы
Ответ 1
Самый чистый способ - это метод расширения
public static class MyUrlHelper
{
public static string CurrentAction(this UrlHelper urlHelper)
{
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;
// in case using virtual dirctory
var rootUrl = urlHelper.Content("~/");
return string.Format("{0}{1}/{2}/", rootUrl, routeValueDictionary["controller"], routeValueDictionary["action"]);
}
}
Ответ 2
Вы получаете данные маршрута от RequestContext
, и на самом деле не имеет значения, как вы к этому относитесь (существует несколько способов). Я бы не стал беспокоиться о том, чтобы пройти через несколько объектов (возможно, всего несколько микросекунд). Вы можете сделать код лучше, либо путем создания метода расширения (например, помощника URL-адреса), либо для того, чтобы рассматриваемый элемент наследовал пользовательскую реализацию WebViewPage
, где вы создаете ярлык для того, что вам нужно. Например:
public abstract class MyWebViewPage<TModel> : WebViewPage<TModel>
{
public string ControllerName
{
get
{
return Url.RequestContext.RouteData.Values["controller"].ToString();
}
}
public string ActionName
{
get
{
return Url.RequestContext.RouteData.Values["action"].ToString();
}
}
}