Вызов UrlHelper в модели в ASP.NET в MVC
Мне нужно создать некоторые URL-адреса в модели в ASP.NET MVC. Я бы хотел назвать что-то вроде UrlHelper.Действие (), которое использует маршруты для создания URL-адреса. Я не против заполнить обычные пробелы, такие как имя хоста, схема и так далее.
есть ли какой-либо метод, который я могу вызвать для этого? Есть ли способ построить UrlHelper?
7 ответов
полезный совет, в любом ASP.NET приложение, вы можете получить ссылку на текущий HttpContext
HttpContext.Current
который является производным от System.Сеть. Таким образом, следующее будет работать в любом месте 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.асакс
Мне нравится ответ Омара, но это не работает для меня. Просто для записи это решение, которое я использую сейчас:
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);
UrlHelper может быть построен из действия контроллера со следующим:
var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(...);
вне контроллера UrlHelper может быть создан путем создания RequestContext из RouteTable.Маршруты RouteData.
HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));
(на основе ответа Брайана, с добавлением незначительной коррекции кода.)
Да, вы можете создать его экземпляр. Вы можете сделать что-то вроде:
var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
new RequestContext(ctx,
RouteTable.Routes.GetRouteData(ctx));
RouteTable.Routes
является статическим свойством, поэтому вы должны быть в порядке; чтобы получить HttpContextBase
ссылка, HttpContextWrapper
принимает ссылку на HttpContext
и HttpContext
доставляет.
попробовав все остальные ответы, я закончил с
$"/api/Things/Action/{id}"
ненавистники будут ненавидеть \_(ツ)_/
Я пытался сделать что-то подобное изнутри страницы (вне контроллера).
UrlHelper не позволил мне построить его так же легко, как ответ Pablos, но затем я вспомнил старый трюк, чтобы эффективно сделать то же самое:
string ResolveUrl(string pathWithTilde)