C#, Asp.Net, .Net Core
ASP.Net Razorda Helper Kullanırken Scriptin 2 Kere İnclude Edilmesini Engellemek
ASP.Net Razorda Helper Kullanırken Scriptin 2 Kere İnclude Edilmesini Engellemek
-
Başlık soruyu açıklıyor sanırım.
Scriptlerle ilgili sorunum var. script include'a ihtiyaç duyan bir razor helperi 2 kere kullanınca gereksiz yere bir script daha ekliyor
(Ayrıca bu scripti kontrolun üstüne eklemek zorunda kalıyorum, headera değil)
buna bir çözüm varmı? Helperi 3 kere de kullansam 1 script eklesin
-
İş görür bu muhtemelen
-
bizde require js kullanıyoruz dependency injection in javascriptteki hali gibidir kendisi kullandığın her js i sayfana ekliyorsun abi o sadece bi instance ını getiriyor ayrıca cdn kullanacaksanda requirejs i öneririm.
-
Bu şekilde çözdüm beyler
using System.Collections.Generic; using System.Text; using System.Web; using System.Web.WebPages.Html; namespace System.Web.WebPages.Html { public static class HtmlHelperExtensions { public static AssetsHelper Assets(this HtmlHelper htmlHelper) { return AssetsHelper.GetInstance(htmlHelper); } } public class AssetsHelper { public static AssetsHelper GetInstance(HtmlHelper htmlHelper) { const string instanceKey = "48F2764A-6898-450E-99F8-1EF0B912ED03"; HttpContext context = HttpContext.Current; if (context == null) return null; AssetsHelper assetsHelper = (AssetsHelper)context.Items[instanceKey]; if (assetsHelper == null) context.Items.Add(instanceKey, assetsHelper = new AssetsHelper()); return assetsHelper; } public ItemRegistrar Styles { get; private set; } public ItemRegistrar Scripts { get; private set; } public ItemRegistrar InlineScripts { get; private set; } public ItemRegistrar InlineStyles { get; private set; } public const string StyleFormat = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />"; public const string ScriptFormat = "<script src=\"{0}\" type=\"text/javascript\"></script>"; public const string InlineScriptsFmt = "<script type=\"text/javascript\">{0}</script>"; public const string InlineStylesFmt = "<style type=\"text/css\">{0}</style>"; public AssetsHelper() { Styles = new ItemRegistrar(StyleFormat); Scripts = new ItemRegistrar(ScriptFormat); InlineScripts = new ItemRegistrar(InlineScriptsFmt); InlineStyles = new ItemRegistrar(InlineStylesFmt); } } public class ItemRegistrar { private readonly string _format; private readonly IList<string> _items; public ItemRegistrar(string format) { _format = format; _items = new List<string>(); } public ItemRegistrar Add(string url) { if (!_items.Contains(url)) _items.Add(url); return this; } public IHtmlString Render() { StringBuilder sb = new StringBuilder(); foreach (string item in _items) { string fmt = string.Format(_format, item); sb.AppendLine(fmt); } return new HtmlString(sb.ToString()); } } }
-
Layouta
@Html.Assets().Styles.Render()
@Html.Assets().Scripts.Render()
@Html.Assets().InlineScripts.Render()
@Html.Assets().InlineStyles.Render()
satırlarını yazıyorum ondan sonra Html.Assets().Scripts.Add(...) ile ekliyorum, aynıları iki kere eklenmiyor. Frameworke dahil edilmeliydi bence