3

MVC ile deneme yapıyorum ve sorum şu: WebForms ile Master Sayfalar'da Page_Load mantığı olan, nerede MVC'ye gitmeliyiz? İşte iş durum:"Ana Sayfa" mantığı MVC'ye nereye gitmeli?

  • Farklı Konakçı Başlıkları, farklı Sayfa Başlıkları sitenin (bir) Usta Sayfa görüntülenecek nedenle tüm sayfaları neden olmalıdır. Örneğin, ana makine üstbilgisi hello.mydomain.com ise, tüm sayfalar/görünümler için sayfa başlığı "Merhaba Dünya" olmalı ve goodbye.mydomain.com tüm sayfalar/görünümler için "Goodbye World" olmalıdır.
  • Ana bilgisayar üstbilgisi listede yer alan her şeyden farklıysa, uygulamada nerede olduğuna bakılmaksızın/Error/NoHostHeader'a yönlendirilmelidir.

Daha önce, bunu MasterPage Load() olayına koydum ve MVC'ye benziyordu, bunu her denetleyicide yapabilirim (bu işlevi her ç denetleyici) veya Global.asax'ta bir yerde (çok mu ... global?).

Düzeltme: Verilerin işlenmesi için bir Denetleyici ile birlikte Global.asax yöntemini kullanarak başarılı bir şekilde çalışmak için bunu aldım. Bu noktada sadece sorun, ana bilgisayar başlık bilgilerinin tamamı bir veritabanındadır. Eğer bir Session değişkeninde iseniz ve orada olmadığında sadece bir DB araması yaparsanız normalde "kiracı" bilgilerini saklardım; Bunu yapmanın daha iyi bir yolu var mı?

cevap

9

yoktur itibaren hayır 1: (en kiracı diyelim, "bu sitenin Sayfalar her zaman belirli bir bağlamda talep edilmektedir:

Model: bir sebebi MVC 1 eşdeğer, en sadece bu konuda MVC şekilde düşünmenin nasıl recapitulate izin veya kullan r, konu veya alt alanlarınız ne olursa olsun). etki alanı modeli, geçerli isteğin kiracı temsil eden bir özelliği vardır "

Görünüm: 'modelde belirlenen kiracı bağlı sayfa başlığını Render'

Kontrolörü:". kiracı Set anabaşlık" bağlı modelinde.

daha sonra tek bir yerde veya bir yerde kontrolör mantığı olması. kontrolör, görünümü ve iş mantığını karıştırma önlemek istediğini, bu çağrılmaz unutmayın Ayrı kaldığı sürece "denetleyici" bir sorun değildir.

Ve şimdi iyi bir şey: Web Formları ile bile bu "MVC stili" yapabilir ve çözüm hala ASP.NET MVC ile çalışır!

Yine de yaşam döngüsü isteğiniz var (sayfa ömrü değil), böylece tüm istekler için denetleyici mantığının bu bölümünü içeren özel bir HttpModule uygulayabilirsiniz. BeginRequest olayını ele alır, ana bilgisayar üstbilgisini kontrol eder ve kiracıyı HttpContext.Current.Items ["kiracı"] gibi bir şeye kaydeder. (Tabii ki, bu sözlük girdisi için statik, yazılan bir sarmalayıcı olabilir.)

Daha sonra, tüm model nesneleriniz (veya bir model temel sınıfı veya çözümünüz için uygun olan her şey) HttpContext'e bu erişim sağlamak için erişebilir böyle bilgiler:

public string Tenant 
{ 
    get { return HttpContext.Current.Items["tenant"]; } 
} 

Avantajları: Sen neden (ana bilgisayar başlık) ve etkisi (sayfa başlığı render)

  • nedenle idame ve test edilebilir iyileştirilmesi ayrıldık

    • Bu duruma dayalı olarak etki alanı modelinize, mevcut kiracıya bağlı olarak veritabanından içerik yüklemek gibi kolayca ek davranışlar ekleyebilirsiniz.
    • Görünümün daha fazla bölümünü, içerdiğiniz CSS dosyası, logo görüntüsü vb. Gibi kiracıya göre kolayca yapabilirsiniz.
    • Daha sonra modeldeki kiracıyı modele göre ayarlamak için denetleyici mantığını değiştirebilirsiniz. alt alan adı olabilir, ancak modele bağlı olarak kodunuzdan herhangi birini değiştirmeden bir çerez, bir yönlendiren, arama terimi, kullanıcı aracısının dili veya düşünebileceğiniz her şeye dayanabilir. Düzenlemenizle yeniden

    Güncelleme: Ben senin oturum tanımlama her bir alt etki alanına, ancak tüm alanların sadece geçerli olabilir, özellikle eğer oturumda devlet tutma fikrini sevmiyorum. Bu durumda, kullanıcılar daha önce başka bir alt alana sahip olmaları durumunda tutarsız içerik sunabilir. Muhtemelen, ana bilgisayar üstbilgilerini kiracılarla eşleştiren veritabanındaki bilgiler çok sık değişmeyecek, bu nedenle önbelleği alabilir ve her istek için bir veritabanı aramasına gerek duymazsınız. İhtiyacınız ne

  • 3

    MVC Ana Sayfa Görünümünüze doğru ViewData ürününü sağlayan bir temel denetleyici oluşturabilir, ardından gerçek denetleyicilerinizin her birini bundan elde edebilirsiniz. Mantığı ActionExecuting yöntemine koyarsanız, gerekirse bir hata sayfasına bir istisna oluşturabilir veya yeniden yönlendirebilirsiniz.

    3

    Ayrıca "WebForms" ve yeterli MVC düşünmüyorsunuz. Ana sayfa, yalnızca görünümünüzün bir sarıcısıdır ve yalnızca düzen html'sini içermelidir. Efendine bir şeyler yollayabilirsin, ama bu tek yönlü bir yol ve agnostik görünümler için uğraşmalısın. Alt satır: WebForms'un burada kullanılmayacakları gibi olan olayları unutun.

    Host başlıklarıyla ilgileniyor beri büyük bir şimdi kafam karıştı ... sen Global.asax koymak herhalde: P

    Çalıntı kodu http://forums.asp.net/t/1226272.aspx

    protected void Application_BeginRequest(object sender, EventArgs e) 
         { 
          string host = string.Empty; 
    
          if (this.Request.ServerVariables["HTTP_HOST"] == this.Request.Url.DnsSafeHost) 
          { 
           host = this.Request.Url.DnsSafeHost; 
          } 
          else 
          { 
           Regex regex = new Regex("http://[^/]*.host/([^/]*)(/.*)"); 
           Match match = regex.Match(this.Request.Url.AbsoluteUri); 
    
           if (match.Success) 
           { 
            host = match.Groups[1].Value; 
            Context.RewritePath(match.Groups[2].Value); 
           } 
          } 
    
          // Match the host with the portal in the database 
          ... 
         } 
    
    +0

    mı? – Brandon