2011-10-23 12 views
16

Ben şimdiki kontrolör adınıAsp.net mvc 3- akım kontrolörü örneği (sadece adı değil)

HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString(); 

olsun Ama (bazı sınıfta akım kontrolörü örneğini almak için herhangi bir yolu yoktur bilen olsun bir eylemde değil ve bir görüşte değil)?

+1

Nerede? Modelde mi? Bir görüşte? Tabii ki bir eylemdeyseniz, kontrol cihazınıza başvurmak için bunu kullanabilirsiniz, fakat sanırım bu durum böyle değil :). – BigMike

+0

Bazı sınıflarda (bir eylemde değil, bir görünümde değil) – Alexandre

+0

MVC modelinde bir Veri Modelinin yöntem akışında ya da bazı yardımcılarda bulunmadığınız sürece bir eylemde olmak zorundasınız. Sadece boş referanslardan kaçınmak için, kontrolör için sınıf metodunuza bir parametre ekleyeceğim ve akışın başladığı ve izlediği yeri izleyeceğim. – BigMike

cevap

22

Varsayılan olarak, numaralı ControllerContext.Controller numaralı bir denetleyiciye ya da ViewContext.Context numaralı bir görünümün içine erişebilirsiniz. Bir sınıftan erişebilmek için denetleyici örneğini bir yerde saklayan ve buradan oradan alabileceğiniz özel bir ControllerFactory uygulamanız gerekir. Örn Request.Items yılında:

public class MyControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     var controller = base.CreateController(requestContext, controllerName); 
     HttpContext.Current.Items["controllerInstance"] = controller; 
     return controller; 
    } 
} 

Sonra Application_Start bunu kayıt:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

Ve denetleyici örneği daha sonra alabilirsiniz:

public class SomeClass 
{ 
    public SomeClass() 
    { 
     var controller = (IController)HttpContext.Current.Items["controllerInstance"]; 
    } 
} 

Ama bazı başka bir yol bulur denetleyici örneğini bu "hacky" geçici çözüm yerine sınıfıma iletmek için. ne yapıyorum bütün Asp.Net sayfa yaşam döngüsü/zararlı olup olmadığını

+6

HttpContext.Current.Session ["controllerInstance"] parametresini HttpContext.Current.Items ["controllerInstance"] değerine değiştirmelisiniz; çünkü oturum, belirli yapılandırmalarla veritabanında son bulabilir. – John

0

Biri beni düzeltmek zorunda kalacak Bunu ne olursa olsun ama mutlaka: denetleyici görünümünde

ViewBag.CurrentController = this; 

yılında

benim durumumda

var c = ViewBag.CurrentController; 
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null); 

, tüm kontrolörler uzatmak baz denetleyicisi vardı. Bu taban denetleyicisinde RenderViewToString adlı statik bir yöntem yaşadı ve bir denetleyici gerektirdi. Bu noktada, c için bu noktada boş bir denetleyicinin yeni bir örneğini başlatabildiğimi düşündüğümden, onu sadece Asp.Net MVC dünyasında bulunan güzel ViewBag kapsayıcısına gönderdim. Şu ana kadar giremediğim sebeplerden dolayı, kontrolördeki diziyi geri alamıyordum ve bunu sadece görüşe geri gönderemedim (ihtiyaçlar değişmeden önce daha önce yapmış olduğum şeydi).

Bu şekilde yaptığımın nedeni PHP ve JS gibi başka dillerde de olduğu için, sınıfları aktarmanın benzer basit yolları vardır.