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

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

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

156
задан pupeno 9 January 2010 в 01:48
поделиться

5 ответов

[

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

] [
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);
]
64
ответ дан 23 November 2019 в 21:50
поделиться
[

]Полезный совет, в любом приложении 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[

].
274
ответ дан 23 November 2019 в 21:50
поделиться
[

]Да, его можно инстанцировать. Вы можете сделать что-то вроде:[

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

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

].
8
ответ дан 23 November 2019 в 21:50
поделиться

UrlHelper может быть создан из действия контроллера с помощью следующих действий:

 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)));

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

44
ответ дан 23 November 2019 в 21:50
поделиться

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

Url.Action("ActionName", "ControllerName");
-30
ответ дан 23 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: