Вызовите UrlHelper в моделях ASP.NET MVC

Мне нужно создать некоторые URL-адреса в модели в ASP.NET MVC. Я хотел бы назвать что-то вроде UrlHelper.Action(), который использует маршруты для создания URL-адреса. Я не против заполнения обычных пробелов, таких как имя хоста, схема и т.д.

Есть ли какой-нибудь метод, который я могу назвать? Есть ли способ создать UrlHelper?

Ответ 1

Мне нравится ответ Омара, но это не работает для меня. Только для записи это решение, которое я использую сейчас:

var httpContext = HttpContext.Current;

if (httpContext == null) {
  var request = new HttpRequest("/", "http://example.com", "");
  var response = new HttpResponse(new StringWriter());
  httpContext = new HttpContext(request, response);
}

var httpContextBase = new HttpContextWrapper(httpContext);
var routeData = new RouteData();
var requestContext = new RequestContext(httpContextBase, routeData);

return new UrlHelper(requestContext);

Ответ 2

Полезный отзыв, в любом приложении ASP.NET, вы можете получить ссылку на текущий HttpContext

HttpContext.Current

который получен из System.Web. Поэтому в приложении ASP.NET MVC будет работать следующее:

UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
url.Action("ContactUs"); // Will output the proper link according to routing info

Пример:

public class MyModel
{
    public int ID { get; private set; }
    public string Link
    {
        get
        {
            UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
            return url.Action("ViewAction", "MyModelController", new { id = this.ID });
        }
    }

    public MyModel(int id)
    {
        this.ID = id;
    }
}

Вызов свойства Link в созданном объекте MyModel возвращает действительный Url для просмотра Модели на основе маршрутизации в Global.asax

Ответ 3

A UrlHelper можно построить из действия Controller со следующим:

 var url = new UrlHelper(this.ControllerContext.RequestContext);
 url.Action(...);

За пределами контроллера UrlHelper может быть сконструирован путем создания RequestContext из RouteTable.Routes RouteData.

HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));

(На основании ответа Брайана с добавлением незначительной корректировки кода.)

Ответ 4

Да, вы можете создать экземпляр. Вы можете сделать что-то вроде:

var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
   new RequestContext(ctx,
   RouteTable.Routes.GetRouteData(ctx));

RouteTable.Routes является статическим свойством, поэтому вы должны быть в порядке; для получения ссылки HttpContextBase HttpContextWrapper берет ссылку на HttpContext, а HttpContext предоставляет это.

Ответ 5

Я пытался сделать что-то подобное на странице (вне контроллера).

UrlHelper не позволял мне строить его так же легко, как ответ Паблоса, но потом я вспомнил, как старый трюк эффективен, чтобы сделать то же самое:

string ResolveUrl(string pathWithTilde)

Ответ 6

Я думаю, что вы ищете:

Url.Action("ActionName", "ControllerName");