Можно ли получить маршрут / виртуальный URL-адрес, связанный с действием контроллера или представлением? Я видел, что в Preview 4 добавлен помощник LinkBuilder.BuildUrlFromExpression, но он не очень полезен, если вы хотите использовать его на мастере, поскольку тип контроллера может быть другим. Любые мысли приветствуются.





Вы можете использовать <% = Url.Action (action, controller, values)%> для создания URL-адреса на главной странице.
Вы делаете это, может быть, чтобы выделить вкладку для текущей страницы или что-то в этом роде?
В таком случае вы можете использовать ViewContext из представления и получать нужные вам значения.
Я написал вспомогательный класс, который позволяет мне получить доступ к параметрам маршрута. С помощью этого помощника вы можете получить контроллер, действие и все параметры, переданные действию.
Это сработало для меня:
<%= this.Url.RouteUrl(this.ViewContext.RouteData.Values) %>
Он возвращает текущий URL как таковой; /Home/About
Может быть, есть более простой способ вернуть фактическую строку маршрута?
Вы можете получить эти данные из ViewContext.RouteData. Ниже приведены несколько примеров того, как получить (и использовать) эту информацию:
/// Они добавлены к моим базовым классам viewmasterpage, viewpage и viewusercontrol:
public bool IsController(string controller)
{
if (ViewContext.RouteData.Values["controller"] != null)
{
return ViewContext.RouteData.Values["controller"].ToString().Equals(controller, StringComparison.OrdinalIgnoreCase);
}
return false;
}
public bool IsAction(string action)
{
if (ViewContext.RouteData.Values["action"] != null)
{
return ViewContext.RouteData.Values["action"].ToString().Equals(action, StringComparison.OrdinalIgnoreCase);
}
return false;
}
public bool IsAction(string action, string controller)
{
return IsController(controller) && IsAction(action);
}
/// Некоторые методы расширения, которые я добавил в класс UrlHelper.
public static class UrlHelperExtensions
{
/// <summary>
/// Determines if the current view equals the specified action
/// </summary>
/// <typeparam name = "TController">The type of the controller.</typeparam>
/// <param name = "helper">Url Helper</param>
/// <param name = "action">The action to check.</param>
/// <returns>
/// <c>true</c> if the specified action is the current view; otherwise, <c>false</c>.
/// </returns>
public static bool IsAction<TController>(this UrlHelper helper, LambdaExpression action) where TController : Controller
{
MethodCallExpression call = action.Body as MethodCallExpression;
if (call == null)
{
throw new ArgumentException("Expression must be a method call", "action");
}
return (call.Method.Name.Equals(helper.ViewContext.ViewName, StringComparison.OrdinalIgnoreCase) &&
typeof(TController) == helper.ViewContext.Controller.GetType());
}
/// <summary>
/// Determines if the current view equals the specified action
/// </summary>
/// <param name = "helper">Url Helper</param>
/// <param name = "actionName">Name of the action.</param>
/// <returns>
/// <c>true</c> if the specified action is the current view; otherwise, <c>false</c>.
/// </returns>
public static bool IsAction(this UrlHelper helper, string actionName)
{
if (String.IsNullOrEmpty(actionName))
{
throw new ArgumentException("Please specify the name of the action", "actionName");
}
string controllerName = helper.ViewContext.RouteData.GetRequiredString("controller");
return IsAction(helper, actionName, controllerName);
}
/// <summary>
/// Determines if the current view equals the specified action
/// </summary>
/// <param name = "helper">Url Helper</param>
/// <param name = "actionName">Name of the action.</param>
/// <param name = "controllerName">Name of the controller.</param>
/// <returns>
/// <c>true</c> if the specified action is the current view; otherwise, <c>false</c>.
/// </returns>
public static bool IsAction(this UrlHelper helper, string actionName, string controllerName)
{
if (String.IsNullOrEmpty(actionName))
{
throw new ArgumentException("Please specify the name of the action", "actionName");
}
if (String.IsNullOrEmpty(controllerName))
{
throw new ArgumentException("Please specify the name of the controller", "controllerName");
}
if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
{
controllerName = controllerName + "Controller";
}
bool isOnView = helper.ViewContext.ViewName.SafeEquals(actionName, StringComparison.OrdinalIgnoreCase);
return isOnView && helper.ViewContext.Controller.GetType().Name.Equals(controllerName, StringComparison.OrdinalIgnoreCase);
}
/// <summary>
/// Determines if the current request is on the specified controller
/// </summary>
/// <param name = "helper">The helper.</param>
/// <param name = "controllerName">Name of the controller.</param>
/// <returns>
/// <c>true</c> if the current view is on the specified controller; otherwise, <c>false</c>.
/// </returns>
public static bool IsController(this UrlHelper helper, string controllerName)
{
if (String.IsNullOrEmpty(controllerName))
{
throw new ArgumentException("Please specify the name of the controller", "controllerName");
}
if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
{
controllerName = controllerName + "Controller";
}
return helper.ViewContext.Controller.GetType().Name.Equals(controllerName, StringComparison.OrdinalIgnoreCase);
}
/// <summary>
/// Determines if the current request is on the specified controller
/// </summary>
/// <typeparam name = "TController">The type of the controller.</typeparam>
/// <param name = "helper">The helper.</param>
/// <returns>
/// <c>true</c> if the current view is on the specified controller; otherwise, <c>false</c>.
/// </returns>
public static bool IsController<TController>(this UrlHelper helper) where TController : Controller
{
return (typeof(TController) == helper.ViewContext.Controller.GetType());
}
}
@qJake Тогда как обмениваться данными между контроллерами в MVC5?
@Mrunal Этот вопрос касается не обмена данными между контроллерами, а скорее о том, как просматривать маршруты, связанные с контроллером. Я знаю, что это возможно с ASP.NET MVC 5 (теперь ASP.NET Core), но я не знаю синтаксиса насквозь.
@qJake: спасибо. На самом деле я начал проект с ASP.Net Core с использованием MVC 5. В этом случае я попытался использовать HttpContext.Current.Session, но не могу получить доступ к нему в своих классах утилит, где я хотел бы установить-получить переменные. Потому что я думаю, как только я это получу, я могу передавать данные между контроллерами через сеанс.
Я всегда стараюсь реализовать максимально простое решение, отвечающее требованиям проекта. Как сказал Эйнштейн: «Делайте вещи как можно проще, но не проще». Попробуй это.
<%: Request.Path %>
Предупреждение: этот код больше не работает в ASP.NET MVC 5.