2010-12-11 25 views
6

Denetleyiciler tarafından [Project] 'de kullanılan bir sınıfım var. Denetleyiciler ve denetleyiciler tarafından farklı alanlarda. Denetleyicinin nerede olduğunu nasıl belirleyebilirim? (Sanırım HttpContext.Current.Request'in özelliklerine bakabilirim - ama "uygun" bir MVC yolu arıyorum). Teşekkür ederim. olduğuŞu anda yürütme alanı nasıl edinilir?

:

[Project].Helpers // called by: 
[Project].Controllers 
[Project].Areas.[Area].Controllers 
// how could I determine the caller from [Project].Helpers? 

cevap

16

"MVC isteğinden itibaren geçerli alan adını almanın bir yolunu" rea "sadece bir yolun bir niteliğidir. Diğer kullanımlar için güvenilir değil. Özellikle, denetleyicilerin yardımcı tarafından kullanılabilecek bir öznitelik (System.Attribute sınıfı değil, soyut terim düşünün) istiyorsanız, o zaman bu öznitelikler denetleyicilerin üzerinde bulunmalıdır, bu alanda değil.

Pratik bir örnek olarak, belirli bir alandaki herhangi bir denetleyiciden önce çalıştırılacak bir mantık (eylem filtresi gibi) istiyorsanız, eylem filtresini doğrudan bu denetleyicilerle ilişkilendirmelidir. Bunu yapmanın en kolay yolu, bazı MyAreaBaseController öğelerini bu filtreyle ilişkilendirmek ve daha sonra mantıksal olarak o alanla ilişkilendirmek istediğiniz her bir denetleyiciye bu tür alt sınıfı eklemek olacaktır. Bir karar vermek için RouteData.DataTokens ["alan"] 'a bakan küresel bir filtre gibi başka herhangi bir kullanım desteklenmez ve potansiyel olarak tehlikelidir.

Gerçekten, gerçekten alan adını almanız gerekiyorsa, onu bulmak için RouteData.DataTokens["area"]'u kullanabilirsiniz.

+0

Merhaba Levi, bu harika bir cevaptı teşekkür ederim. –

+1

Bu konuda .NET ekibinden haber almak harika. Cevabınız görünümde olduğunda geçerli midir? Farklı alanlarda kullanılan bir paylaşılan görüşüme sahibim ve kullanıcının sitede bulunduğu yere göre görünümünü değiştirmek istiyorum. Kısmi bir görünüm kullanabilirdim, ancak ana görünüm neredeyse boş olurdu. ViewBag'a bir şey koymak yanlış görünüyor çünkü bu kesinlikle bir sunum mantığı. –

4

Sen RouteData dan alan dize almak mümkün olmalıdır: ..

// action inside a controller in an area 
public ActionResult Index() 
{ 
    var area = RouteData.DataTokens["area"]; 
    .... 
    return View(); 
} 

yüzden böyle yardımcıları için bir uzantısı yöntemi yapabilirsiniz:

public static class SomeHelper // in [Project].Helpers 
{ 
    public static string Area(this HtmlHelper helper) 
    { 
     return (string)helper.ViewContext.RouteData.DataTokens["area"]; 
    } 
} 
İlgili konular