2016-04-14 12 views
1

Denetleyicilerin birinde, her görünümde sabit bir önişleme vardır. Aşağıdaki kod yerine, bunu yapmanın daha iyi bir yolu var mı? dönüş Görünüm() dönüş Görünüm() Bu kontrol cihazında ile tüm fonksiyonlar için önce satır yazmadan şekilde SomeFunctionAsync çalışır? Ayrıca bazı ajax sonrası işlevleri var. Ben mümkün istiyorum sonunda başka deyişle Görünüm denetleyicide ortak kod nereye koyulur?

public async Task<ActionResult> View1() 
{ 
    await SomeFunctionAsync(); 
    return View(); 
} 

public async Task<ActionResult> View2() 
{ 
    await SomeFunctionAsync(); 
    return View(); 
} 

, Sen denetleyicisi için bir temel sınıf oluşturabilir

public async Task<ActionResult> View1() 
{ 
    return View(); 
} 

public async Task<ActionResult> View2() 
{ 
    return View(); 
} 
+0

Denetleyicilerin görünümleri değil eylemleri vardır. Ayrıca ne soruyorsun? "Ortak kod" tipik olarak bir yönteme çıkartmak ve bu yöntemi çağırmak anlamına gelir. Bu kodu nerede saklayacağınızı mı yoksa çağrıdan nasıl kurtulacağınızı mı soruyorsunuz? Örneğin, filtreler oluşturabilir ancak bunlar karmaşıklık ekler –

+0

Aramaktan kurtulmak istiyorum. Şu anda bu işlev denetleyicimde özel bir işlevdir. Ve bir görüşe geri dönen her fonksiyon bunu çağırmalıdır. –

+0

Sonuç için bir görünüm adını geçirebileceğinizi bilmiyor musunuz? Farklı görünümler kullanılarak tek bir eylem oluşturulabilir. "View1", "View2" yöntemlerinizi çağırmak yerine, aslında bir eylem olan, örneğin "Oluştur" ve geri dönme Görünüm ("Görünüm 1") veya "Görünüm (" Görünüm 2 ")) döndüren tek bir eylemin olması gerekir. –

cevap

0

aynı etkiyi haiz aşağıdaki yazmak ve her bir görünüme sahip olması için kodunuzda genel bir yöntem çağırın. Bir yöntem adı olarak GetView kullanıyorum (veya mevcut olanları geçersiz kılabilirsiniz).

böylece gibi: Kumandanızda içinde Sonra

public class MyControllerBase : Controller { 

    public Task<ActionResult> GetView() { 
     yourCommonMethod(); 
     return View(); 
    } 

    public Task<ActionResult> GetView(string viewName) { 
     yourCommonMethod(); 
     return View(viewName); 
    } 

    public Task<ActionResult> GetView(object model) { 
     yourCommonMethod(); 
     return View(model); 
    } 


    public Task<ActionResult> GetView(string viewName, object model) { 
     yourCommonMethod(); 
     return View(viewName, model); 
    } 

} 

ki devralan:

public class MyController : MyControllerBase { 

    public async Task<ActionResult> View1() 
    { 
     return GetView(); 
    } 

} 

yaygın yöntem tüm kontrolörler için aynıdır ve hiçbir denetleyici özgü bağımlılıkları varsa, o olabilir bu kadar basit ol. Ancak, siz de eşdeğer ilaç kullanımıyla bakmak isteyebilirsiniz:

public class MyControllerBase<T> : Controller { 
    // base class stuff here based on type T's interface 
} 


public class MyController : MyControllerBase<MyController> { 
    // regular class here, sending MyController to the base 
} 

Bunlar OOP oldukça fazla yapı taşlarıdır. OOP'un temellerini kapsayan bir kitap almak ve bu tür şeylerle çalışmak için iyi bir şey yapabilirsiniz.

0

çekme yolu vardır:

  1. , eğer yapabilirsiniz dönüş Görünüm ("View1") gibi farklı görünüm içeren tek Eylem kullanın veya Görünüm ("View2") retrun olacak bu yüzden orada başka koşullar Fonksiyonunuzu tek bir yerde arayın.

  2. sen (önerilmez) Mevcut prosedüre gitmek istiyorsanız o zaman o zaman her eylem Eylem çalıştırılmadan önce mantık yürütülür Eylem Filtre özelliğini kullanabilir ve Denetleyici düzeyde dekore zorunda

2

Varun'un önerdiği gibi Action Filter size uymuyorsa, başka bir şekilde deneyebilirsiniz.

Ebeveyn oluşturma Tüm görünümün görünümü. Ebeveyn görünümünüz için eylem yönteminde. Bu Yöntemi SomeFunctionAsync() arayın. Böylece, tüm görünümler için üst görünüm çağrılacak ve gerekli yöntem yürütülecektir.

İlgili konular