2009-06-03 16 views
81

Görünümü gerçekleştirmeden önce denetleyiciden belirli bir görünüm adının olup olmadığını belirlemek mümkün mü?Asp.Net MVC'de bir görünüm var mı?

Oluşturulacak görünümün adını dinamik olarak belirleme gereksinimim var. Bu ada sahip bir görünüm varsa, o görünümü oluşturmam gerekiyor. Özel adla görüş belirtilmemişse, varsayılan bir görünüm oluşturmam gerekiyor.

benim denetleyicisi Aşağıdaki koda benzer bir şey yapmak istiyorum:

public ActionResult Index() 
{ 
    var name = SomeMethodToGetViewName(); 

    //the 'ViewExists' method is what I've been unable to find. 
    if(ViewExists(name)) 
    { 
     retun View(name); 
    } 
    else 
    { 
     return View(); 
    } 
} 

teşekkür ederiz.

+10

Sadece bunun başlığını okumak, onun çok derin bir felsefi soru gibi görünüyor. –

cevap

136
private bool ViewExists(string name) 
{ 
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); 
    return (result.View != null); 
} 

Bunu, Dave tarafından verilen çözüme dayanarak, çoklu denetleyici eylemleri arasında yeniden kullanmak isterseniz, aşağıdaki gibi özel bir görünüm sonucu tanımlayabilirsiniz:

public class CustomViewResult : ViewResult 
{ 
    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     string name = SomeMethodToGetViewName(); 

     ViewEngineResult result = ViewEngines.Engines.FindView(context, name, null); 

     if (result.View != null) 
     { 
      return result; 
     } 

     return base.FindView(context); 
    } 

    ... 
} 

Ardından eylem sadece özel görünümünüze bir örneğini döndürür:

public ActionResult Index() 
{ 
    return new CustomViewResult(); 
} 
+2

Bu muhtemelen daha iyi. ViewEngines koleksiyonunun kendisinden bir FindView yöntemi olduğunu bilmiyordum. –

+0

Bu işe yarayacak gibi görünüyor. Teşekkürler Dave. –

+1

Ancak görünümün diğer denetleyici için olup olmadığını nasıl kontrol edersiniz? – SOReader

15

Ne Aşağıdaki varsayarak kullandığınız tek bir görünüm motoru gibi bir şey çalışıyorsun:

public static class ControllerExtensions 
{ 
    public static bool ViewExists(this Controller controller, string name) 
    { 
     ViewEngineResult result = ViewEngines.Engines.FindView(controller.ControllerContext, name, null); 
     return (result.View != null); 
    } 
} 
+0

bu kabul edilen cevaptan 3 dakika önce gönderilmiş gibi görünüyor ve henüz aşk yok mu ?! +1 benden. –

+0

@TrevordeKoekkoek ... hmmm ... + 1 –

2

Eğer: Bir kopyalama/yapıştırma uzatma yöntemi için arayanlar için

bool viewExists = ViewEngines.Engines[0].FindView(ControllerContext, "ViewName", "MasterName", false) != null; 
5

Burada

try 
{ 
    @Html.Partial("Category/SearchPanel/" + Model.CategoryKey) 
} 
catch (InvalidOperationException) { } 
+0

no'lu çözümün test edilmesi için çalışıyorum. .cshtml dosyası. Bu soru için gerçekten bir cevap değil, ama burada bağlantısı olan başka bir soru yanlış kapatıldı, bu yüzden cevabımı burada bırakıyorum –

+1

Bu aslında benim kullanımım için dikkatimi çekti, çünkü bir kültüre özgü bir yol kullanmak için bir yol arıyordum Kısmi görüntü. Bu yüzden bunu kültüre özgü görünüm adıyla aradım ve daha sonra yakalama içindeki varsayılan görünümü çağırdım.Ve bunu bir yardımcı fonksiyonda yapıyordum, bu yüzden 'FindView' yönteminin ihtiyacı olan' ControllerContext''e erişimim yoktu. – awe

+4

İstisna dayalı akış denetimi bir kod kokusu ... – ErikE

1
ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null 

Benim 2 cent yapmanın başka [mutlaka tavsiye] yoludur.

İlgili konular