ASP.NET MVC modellerinde UrlHelper'ı çağırın


159

ASP.NET MVC bir modelde bazı URL'ler oluşturmak gerekiyor. URL'yi oluşturmak için yolları kullanan UrlHelper.Action () gibi bir şey çağırmak istiyorum. Ana bilgisayar adı, şema ve benzeri gibi olağan boşlukları doldurmak umrumda değil.

Bunun için arayabileceğim herhangi bir yöntem var mı? UrlHelper oluşturmanın bir yolu var mı?


1
Bunu kendim düşünüyordum, ancak Url.Action'ın göreli bir URL oluşturacağını unutmayın. İstediğinizin bu olduğundan emin olun.
Vivian River

Yanıtlar:


277

Yararlı ipucu, herhangi bir ASP.NET uygulamasında, geçerli HttpContext referansını alabilirsiniz

HttpContext.Current

System.Web'den türetilmiştir. Bu nedenle, aşağıdakiler bir ASP.NET MVC uygulamasında herhangi bir yerde çalışır:

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

Misal:

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

LinkOluşturulan MyModel nesnesindeki özelliğin çağrılması, Global.asax'taki yönlendirmeye dayalı olarak Modeli görüntülemek için geçerli URL'yi döndürür


Bir HttpContext.Current.Request.RequestContext olduğundan emin misiniz? HttpContext.Current.Request öğesinde RequestContext bulunmuyor gibi görünüyor.
pupeno

1
Bu garip. Bu çözümü test ettim ve mükemmel çalışıyor. ASP.NET MVC 2 Önizleme 2 çalıştırıyorum, ancak bu tüm sürümlerinde çalışır düşünüyorum. Neden senin için işe yaramadığından emin değilim. Sınıfı bir MVC projesi dışında mı oluşturuyorsunuz? Ayrıca usingher ikisi için de olduğundan emin olun System.WebveSystem.Web.Mvc
Omar

Bir ASP.NET MVC 1 projedeyim, eksik kullanımları düşündüm ama ikisine de sahibim.
pupeno

Neden gösterilmediğinden emin değilim. Başkası bunu ASP.NET MVC 1'de mevcut olmadığını onaylarsa, bu harika olurdu. VS2010 ve MVC 2 yüklü yalnızca bir makinem var. Eğer ilgileniyorsanız, MVC RC 2 haacked.com/archive/2009/12/16/aspnetmvc-2-rc.aspx
Omar

6
Request.RequestContex'in .NET4 +
h - n

64

Omar'ın cevabını seviyorum ama bu benim için çalışmıyor. Sadece kayıt için şu anda kullandığım çözüm:

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

Sitemin URL'sini içeriyor. Orada, kaldırdım.
pupeno

4
UrlHelper sınıfının istek bağlamına (ve HTTP bağlamına) bağlı olduğu düşünüldüğünde, bu bağlam nesnelerini el ile oluşturmak beklenmedik sonuçlar verebilir. HttpContext.Current boşsa ve bu yaklaşımı kullanırsanız, dikkatle devam ediyorum.
Sean

4
Bu yanıta dikkat edin - dummied RequestContext, her zaman boş dize döndüren bir UrlHelper ile sonuçlanır.
gknicker

47

UrlHelper, Denetleyici eylemi içinden aşağıdakilerle oluşturulabilir:

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

Bir denetleyicinin dışında bir UrlHelper, RouteTable.Routes RouteData'dan bir RequestContext oluşturularak oluşturulabilir.

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

(Brian'ın cevabına dayanarak, küçük bir kod düzeltmesi eklendi.)


2
Ama modelde bir denetleyicim yok.
pupeno

Tamam özür dilerim, kodun tam olarak nerede yürütüldüğünden emin değildim. Bir bakayım ...
Nathan Taylor

2
Yeni bir istek bağlamı oluşturmaya gerek yok:var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
bradlis7

Güzel @ bradlis7. Bu MVC 5 mi?
Nathan Taylor

1
Çalışmıyor, çünkü this.ControllerContext.RequestContexta HttpRequestContextve UrlHelperbeklenti kurucusu a RequestContext. Her iki sınıf da ilgisizdir.
Florian Winter

8

Evet, başlatabilirsiniz. Gibi bir şey yapabilirsiniz:

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

RouteTable.Routesstatik bir özellik, bu yüzden orada Tamam olmalıdır; Bir almak için HttpContextBasebaşvuru, HttpContextWrapperbaşvuru alır HttpContextve HttpContextbu sunar.


Çok yakın olsa da bu işe yaramayacak. Cevabımı aşağıda görebilirsiniz.
Nathan Taylor

3

Diğer tüm cevapları denedikten sonra

$"/api/Things/Action/{id}"

Nefret edenler nefret edecek ¯ \ _ (ツ) _ / ¯


0

Bir sayfa içinde (bir denetleyici dışında) benzer bir şey yapmaya çalışıyordum.

UrlHelper, Pablos'un yanıtı kadar kolayca inşa etmeme izin vermedi, ancak daha sonra aynı şeyi etkili bir şekilde yapmak için eski bir numara hatırladım:

string ResolveUrl(string pathWithTilde)

-30

Bence bu aradığınız şey:

Url.Action("ActionName", "ControllerName");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.