2011-03-15 14 views
7

Şu anda Düzenleme dosyasının başlığına komut dosyası ve css dosyaları eklemek için aşağıdaki koda benzeyen bir yöntem kullanıyorum. Layout_.cshtml bunları işlemek için dosyaları ... Ve @Html.MyCompany().Styles.Render() eklemek için Html.MyCompany().Styles.Add("/Dashboard/Content/Dashboard.css"); kullanmaMVC 3 Razor web sitesindeki düzen dosyasına JS ve CSS eklemeye çalışmak kısmi görünümden

public static class HtmlHelperExtensions 
{ 
    public static MyCompanyHtmlHelpers MyCompany(this HtmlHelper htmlHelper) 
    { 
     return MyCompanyHtmlHelpers.GetInstance(htmlHelper); 
    }  
} 

public class MyCompanyHtmlHelpers 
{ 
    private static MyCompanyHtmlHelpers _instance; 

    public static MyCompanyHtmlHelpers GetInstance(HtmlHelper htmlHelper) 
    { 
     if (_instance == null) 
      _instance = new MyCompanyHtmlHelpers(); 

     _instance.SetHtmlHelper(htmlHelper); 

     return _instance; 
    } 

    private HtmlHelper _htmlHelper; 

    public ItemRegistrar Styles { get; private set; } 
    public ItemRegistrar Scripts { get; private set; } 

    public MyCompanyHtmlHelpers() 
    { 
     Styles = new ItemRegistrar(ItemRegistrarFromatters.StyleFormat); 
     Scripts = new ItemRegistrar(ItemRegistrarFromatters.ScriptFormat); 
    } 

    private void SetHtmlHelper(HtmlHelper htmlHelper) 
    { 
     _htmlHelper = htmlHelper; 
    } 
} 

public class ItemRegistrar 
{ 
    private readonly string _format; 
    private readonly List<string> _items; 

    public ItemRegistrar(string format) 
    { 
     _format = format; 
     _items = new List<string>(); 
    } 

    public ItemRegistrar Add(string url) 
    { 
     if (!_items.Contains(url)) 
      _items.Insert(0, url); 

     return this; 
    } 

    public IHtmlString Render() 
    { 
     var sb = new StringBuilder(); 

     foreach (var item in _items) 
     { 
      var fmt = string.Format(_format, item); 
      sb.AppendLine(fmt); 
     } 

     return new HtmlString(sb.ToString()); 
    } 
} 

public class ItemRegistrarFromatters 
{ 
    public const string StyleFormat = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />"; 
    public const string ScriptFormat = "<script src=\"{0}\" type=\"text/javascript\"></script>"; 
} 

.

Sorunum, bunun stil sayfaları ve komut dosyası dosyalarının listesinde kalması anlamına gelen statik bir yöntem olmasıdır.

Bunun yaptıklarının aynısını yapmaya devam etmeliyim, ancak bunu devam ettirmeden.

Sayfadan sayfaya belirli bir sayfada nelerin göründüğünü değiştirdiğinden, her istekte yeniden oluşturulacak listelere ihtiyacım var.

Gereksinim duyulan komut dosyalarını eklemeden önce veya belki de işlendikten sonra listeleri temizlemek mümkün mü?

Güncelleme: bir bölüm kullanmayan nedeni, RenderPartial veya RenderaActions aynı stil veya komut dosyasını önlemektir Düzen dosyasına defadan fazla eklenecek.

Site im binasında temel yerleşim düzenine sahip bir Layout_.cshtml vardır. sırayla Bu öğelerin bir listesi üzerinden ve o öğenin belirli kısmi bir görünüm verir bir RenderAction denir her öğe için döngüler bir Görüntüleme tarafından kullanılır. Bu kısmi görünümlerin bazen stil sayfaları ve komut dosyaları eklemesi gerekir.

Farklı kısmi görünümlerden birçok farklı komut dosyası ve stil sayfası eklemek için gerekli olabileceğinden, bir komut dosyasının tümünün zaten olup olmadığını kontrol etmek için genel bir yer olduğu için bunun yapılabileceğini düşündüğüm tek yöntem stiller ve komut dosyaları için genel bir liste idi. koleksiyona eklendi veya eklenmedi ve hepsini eklendikleri sırayla bir kerede oluşturdu.

Güncelleme 2: asıl soru aynı işlevin tür (global liste) ancak statik Uzatma yöntemi kullanmadan nasıl olduğunu.

+0

Bu statik alan mahkum! Bunu yapma ... bak ... –

+1

Tam olarak emin değilim * neden * tam olarak böyle yapmak gerekir? Bunu bölümler, RenderPartial veya RenderActions ile yapamaz mısınız? –

+0

Evet statikler, bunu öğrendim saf kötülük ama ben vardı pek çok seçenek vardı :) Ben hala iyi bir şekilde korumak için komut dosyaları ve stil sayfaları için küresel bir listeye ihtiyacım var düşünüyorum. –

cevap

9

ben yani bölümleri ile

@section head { 
    ...add whatever you want here... 
} 

Bunu yapmak Ve düzenden "kafa" bölümüne işlemek istiyorum:

<head> 
...other stuff here... 
@RenderSection("head", required: false) 
</head> 

yönelik bölümler istemiyorsanız ve Onu geçmek istemiyorum, HttpContext'i burada kullanırdım; Bazı verileri HttpContext.Current.Items[someKey]'a karşı saklayın. Eğer boşsa, yeni bir tane oluşturun ve bağlamında saklayın.Örneğin

:

public static MyCompanyHtmlHelpers GetInstance(HtmlHelper htmlHelper) 
{ 
    const string key = "MyCompanyHtmlHelpersInstance"; 
    IDictionary items = (htmlHelper == null || htmlHelper.ViewContext == null 
     || htmlHelper.ViewContext.HttpContext == null) 
     ? HttpContext.Current.Items : htmlHelper.ViewContext.HttpContext.Items; 

    MyCompanyHtmlHelpers obj = (MyCompanyHtmlHelpers)items[key]; 
    if (obj == null) 
    { 
     items.Add(key, obj = new MyCompanyHtmlHelpers()); 
    } 
    return obj; 
} 
+0

@Marc: bölüm tanımının önünde bir @ eksik. Bunun dışında, oy verin :) –

+0

@Yngve - ta; bunu düzeltdi. Şimdiye kadar bunu hatırlayacağımı düşünürsünüz ... –

+0

Görünümde kullandığım RenderActions tarafından oluşturulan kısmi görünümlerin bölümlerini tanımlayabilirsem, bu işe yarayabilir ama gerçekten bunu kontrol etmenin bir yolu var mı? bir betik veya stil sayfası, bölüme hiç eklenmemiş mi? –

0

Yapmanız gereken şey, Html yardımcısını biraz farklı şekilde genişletmektir. senin görünümünde Sonra

public static MvcHtmlString AddStyle(this HtmlHelper<TModel> html, string styleUrl) 
{ 
    string styleTag = string.Format("<link rel='stylesheet' type='text/css' href='{0}' />", styleUrl); 
    return MvcHtmlString.Create(styleTag); 
} 

sadece yapın: Eğer kök göreli URL'ler, URL içerik yardımcı atmak gerekirse

<head> 
    @Html.AddStyle("/Dashboard/Content/Dashboard.css") 
</head> 

.

<head> 
    @Html.AddStyle(Url.Content("~/Dashboard/Content/Dashboard.css")) 
</head> 
+0

Bu, stilleri kısmi görünümden düzen dosyasına nasıl ekler? –

+0

Sorunuzu yanlış yorumlamıyor muyum? – Chev

1

ben yardımcı olduğunu umuyoruz aynı sorun haline kendimi koştum ve bir fikir geldi.

Ben ile geldi ne için bu diğer soruya bakın:

How to render JavaScript into MasterLayout section from partial view?

+1

Diğer cevabınız hakkındaki yorumlarıma göre, bu sorunun işaretlenip muhtemelen topluluk tarafından silinmesinden önce bunu düzeltmenizi öneriyorum. Teşekkürler. – Kev

+0

Yapacaksınız, bayım. –

İlgili konular