Программное изменение встроенного ресурса перед его регистрацией / ссылкой на страницу - PullRequest
3 голосов
/ 05 марта 2010

Во-первых, «изменение» может быть неправильным термином, я вижу, что несколько человек опубликовали в Интернете только вопрос, могут ли они действительно изменить встроенный ресурс.Я хочу использовать ресурс в своей сборке в качестве своего рода шаблона, который я бы нашел и заменил до регистрации на странице - это возможно?

Например;скажем, у меня есть несколько строк jQuery в качестве встроенного ресурса в моей сборке, и в этом сценарии я ссылаюсь на имя класса CSS, которое может быть задано программистом интерфейса.Поскольку я не знаю, каким будет класс CSS до реализации, есть ли способ пройти через встроенный ресурс и заменить, скажем, $ myclass $ на ThisClassName.

Любая помощь будет принята, если она невозможно, тогда, по крайней мере, скажи мне, чтобы я мог перестать гоняться за своим хвостом.

Ответы [ 2 ]

1 голос
/ 24 марта 2010

Я решил свою маленькую проблему, создав обработчик HTTP. В данном случае он называется DynamicClientScript.axd.

Я взял несколько фрагментов из своего кода, чтобы дать вам идею. Приведенный ниже код получает стандартный URL-адрес встроенного ресурса и берет из него строку запроса для добавления к пути к моему обработчику.

    /// <summary>
    /// Gets the dynamic web resource URL to reference on the page.
    /// </summary>
    /// <param name="type">The type of the resource.</param>
    /// <param name="resourceName">Name of the resource.</param>
    /// <returns>Path to the web resource.</returns>
    public string GetScriptResourceUrl(Type type, string resourceName)
    {
        this.scriptResourceUrl = this.currentPage.ClientScript.GetWebResourceUrl(type, resourceName);

        string resourceQueryString = this.scriptResourceUrl.Substring(this.scriptResourceUrl.IndexOf("d="));

        DynamicScriptSessionManager sessMngr = new DynamicScriptSessionManager();
        Guid paramGuid = sessMngr.StoreScriptParameters(this.Parameters);

        return string.Format("/DynamicScriptResource.axd?{0}&paramGuid={1}", resourceQueryString, paramGuid.ToString());
    }

    /// <summary>
    /// Registers the client script include.
    /// </summary>
    /// <param name="key">The key of the client script include to register.</param>
    /// <param name="type">The type of the resource.</param>
    /// <param name="resourceName">Name of the resource.</param>
    public void RegisterClientScriptInclude(string key, Type type, string resourceName)
    {
        this.currentPage.ClientScript.RegisterClientScriptInclude(key, this.GetScriptResourceUrl(type, resourceName));
    }

Затем обработчик берет свою строку запроса для построения URL-адреса стандартного ресурса. Читает ресурс и заменяет каждый ключ его значением в коллекции словарей (DynamicClientScriptParameters).

ParamGuid - это идентификатор, используемый для получения правильной коллекции параметров скрипта.

Что делает обработчик ...

        public void ProcessRequest(HttpContext context)
    {
        string d = HttpContext.Current.Request.QueryString["d"]; 
        string t = HttpContext.Current.Request.QueryString["t"];
        string paramGuid = HttpContext.Current.Request.QueryString["paramGuid"];

        string urlFormatter = "http://" + HttpContext.Current.Request.Url.Host + "/WebResource.axd?d={0}&t={1)";

        // URL to resource.
        string url = string.Format(urlFormatter, d, t);

        string strResult = string.Empty;

        WebResponse objResponse;
        WebRequest objRequest = System.Net.HttpWebRequest.Create(url);

        objResponse = objRequest.GetResponse();

        using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
        {
            strResult = sr.ReadToEnd();

            // Close and clean up the StreamReader
            sr.Close();
        }

        DynamicScriptSessionManager sessionManager = (DynamicScriptSessionManager)HttpContext.Current.Application["DynamicScriptSessionManager"];

        DynamicClientScriptParameters parameters = null;

        foreach (var item in sessionManager)
        {
            Guid guid = new Guid(paramGuid);

            if (item.SessionID == guid)
            {
                parameters = item.DynamicScriptParameters;
            }
        }

        foreach (var item in parameters)
        {
            strResult = strResult.Replace("$" + item.Key + "$", item.Value);
        }

        // Display results to a webpage
        context.Response.Write(strResult);
    }

Затем в своем коде, где я хочу сослаться на свой ресурс, я использую следующее.

            DynamicClientScript dcs = new DynamicClientScript(this.GetType(), "MyNamespace.MyScriptResource.js");

        dcs.Parameters.Add("myParam", "myValue");

        dcs.RegisterClientScriptInclude("scriptKey");

Тогда скажите, что мой ресурс скрипта содержит:

alert('$myParam$');

Он выведет, как если бы это было:

alert('myValue');

Мой код также выполняет некоторое кеширование (используя DynamicScriptSessionManager), но вы поняли ...

Приветствия

0 голосов
/ 05 марта 2010

В своем коде вы можете читать содержимое встроенного ресурса, выключать все, что хотите, а затем записывать новое содержимое в ответ. Примерно так:

protected void Page_Load(object sender, EventArgs e)
{
    string contents = ReadEmbeddedResource("ClassLibrary1", "ClassLibrary1.TestJavaScript.js");
    //replace part of contents
    //write new contents to response
    Response.Write(String.Format("<script>{0}</script>", contents));
}

private string ReadEmbeddedResource(string assemblyName, string resouceName)
{
    var assembly = Assembly.Load(assemblyName);
    using (var stream = assembly.GetManifestResourceStream(resouceName))
    using(var reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...