Получить виртуальный путь действия извне контроллера - PullRequest
0 голосов
/ 01 ноября 2019

Я использую ASP.NET MVC 5.2.7 для таргетинга .NET Framework 4.6.1.

Изнутри, скажем, бизнес-объект, а не изнутри контроллера или представления, как я могу получитьвиртуальный путь, то есть полный URL-адрес действия.

Такой, что:

"~/Action/Controller/param"

становится

"/Action/Controller/param"

Почему?

Для тех, кто интересуется, в чём дело, и почему я не могу просто удалить ведущий символ тильды (~), два пути (один с тильдой и один без тильды) могут быть разнымив случае, если ваше веб-приложение не развернуто в корневом каталоге сайта.

Например, у вас есть веб-сайт, сопоставленный с domain.com/foo. Затем вы хотели бы, чтобы "~/Controller/Action" вернул /foo/Controller/Action.

Например,

class MyBusinessObject
{
  public void DoSomething()
  {
    // From here, what do I do such that
    // "~/Controller/Action/param" becomes
    // /Controller/Action/param
    // without doing it by hand
  }
}

class MyController : Mvc.Controller
{
  public ActionResult SomeAction()
  {
    new MyBusinessObject().DoSomething();

    ...

    return View();
  }
}

Есть ли уже метод в MVC или в библиотеках фреймворка .NET?

Другими словами, если бы я мог вызвать расширение Url.Content() из-за пределов контроллера, он бы это сделал.

Я делал это много раз раньше, но я всегда забуду и опубликуювопрос по этому поводу. Но я не могу найти свой предыдущий вопрос по этому поводу.

1 Ответ

0 голосов
/ 01 ноября 2019

Хорошо, я внезапно вспомнил, как только я написал «если бы я мог вызвать Url.Helper» в вопросе.

Несмотря на то, что метод Content класса UrlHelper общедоступен, выне может использовать его из-за пределов контроллера, например, так:

class BusinessObject
{
  void DoSomething()
  {
    var url = System.Web.Mvc.UrlHelper.Content("~/Controller/Action/param");
  }
}

, потому что внутренне он вызывает другой метод, передавая ему объект HttpContext, например:

public virtual string Content(string contentPath)
{
    return GenerateContentUrl(contentPath, RequestContext.HttpContext);
}

Однако это GenerateContentUrlметод, который он вызывает, также public. И это также static, поэтому нет необходимости создавать UrlHelper объект. Итак, мы можем назвать это так:

var virtualPath = System.Web.Mvc.UrlHelper.GenerateContentUrl(
                   "~/Action/Controller/Param", 
                   new HttpContextWrapper(HttpContext.Current));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...