Как использовать Url.Action() в файле класса?

Как я могу использовать Url.Action() в файле класса проекта MVC?

Как

namespace _3harf
{
    public class myFunction
    {
        public static void CheckUserAdminPanelPermissionToAccess()
        {
            if (ReferenceEquals(HttpContext.Current.Session["Loged"], "true") &&
                myFunction.GetPermission.AdminPermissionToLoginAdminPanel(
                    Convert.ToInt32(HttpContext.Current.Session["UID"])))
            {
                HttpContext.Current.Response.Redirect(Url.Action("MainPage", "Index"));
            }
        }
    }
}

Ответ 1

Вам нужно будет вручную создать класс UrlHelper и передать соответствующий RequestContext. Это может быть сделано с чем-то вроде:

var requestContext = HttpContext.Current.Request.RequestContext;
new UrlHelper(requestContext).Action("Index", "MainPage");

Однако вы пытаетесь добиться перенаправления на основе аутентификации. Я предлагаю вам взглянуть на реализацию пользовательского фильтра AuthorizeAttribute чтобы добиться такого поведения, чтобы оно больше соответствовало инфраструктуре

Ответ 2

Передайте RequestContext в свой пользовательский класс из контроллера. Я бы добавил конструктор в свой собственный класс, чтобы справиться с этим.

using System.Web.Mvc;
public class MyCustomClass
{
    private UrlHelper _urlHelper;
    public MyCustomClass(UrlHelper urlHelper)
    {
        _urlHelper = urlHelper;
    }
    public string GetThatURL()
    {         
      string url=_urlHelper.Action("Index", "Invoices"); 
      //do something with url or return it
      return url;
    }
}

Вам нужно импортировать пространство имен System.Web.Mvc в этот класс, чтобы использовать класс UrlHelper.

Теперь в вашем контроллере создайте объект MyCustomClass и передайте контекст контроллера в конструкторе,

UrlHelper uHelp = new UrlHelper(this.ControllerContext.RequestContext);
var myCustom= new MyCustomClass(uHelp );    
//Now call the method to get the Paging markup.
string thatUrl= myCustom.GetThatURL();

Ответ 3

Ответ @Simon Belanger отлично работает, но UrlHelper.Action() генерирует относительные URL, и в моем случае мне нужен полностью определенный абсолютный URL. Так что мне нужно сделать - я должен использовать одну из перегрузок, предоставляемых методом UrlHelper.Action().

var requestContext = HttpContext.Current.Request.RequestContext;
string link = new UrlHelper(requestContext).Action("Index", "Home", null, HttpContext.Current.Request.Url.Scheme);

Допустим, если ваше приложение размещено на " https://myexamplesite.com ", то приведенный выше код даст вам полный URL-адрес, например: " https://myexamplesite.com/Home/Index ". Надеюсь, этот ответ поможет тем читателям, которые попадут по этой ссылке.

Ответ 4

Я попытался использовать ответ @simion, и я получил неверный тип в конструкторе для UrlHelper. "невозможно преобразовать из System.Web.Routing.RequestContext в System.Net.Http.HttpRequestMessage"

Так что я использовал это

var urlHelper = new System.Web.Mvc.UrlHelper(HttpContext.Current.Request.RequestContext); string url = urlHelper.Action("MainPage", "Index");

сработало для меня.