Как я могу вызвать функции JavaScript с ScriptManager.RegisterStartUpScript внутри файла handler.ashx? - PullRequest
0 голосов
/ 11 октября 2011

У меня есть повторитель, как показано ниже:

                    <asp:Repeater ID="Repeater1" runat="server">
                        <ItemTemplate>
                            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("FilePath","~/HandlerForRepeater.ashx?path={0}") %>'><%# Eval("FileName")%></asp:HyperLink>
                            <br />
                            <asp:Label ID="Label3" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "FileCreationDate", "{0:tt h:m:s - yyyy/MM/dd}") %>'></asp:Label>
                            <hr />
                        </ItemTemplate>
                    </asp:Repeater>

У меня есть HandlerForRepeater.ashx для сохранения в виде диалога, как показано ниже:

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace FileExplorer
    {
        /// <summary>
        /// Summary description for HandlerForRepeater
        /// </summary>
        public class HandlerForRepeater : IHttpHandler, System.Web.SessionState.IRequiresSessionState
        {

            private HttpContext _context;
            private HttpContext Context
            {
                get
                {
                    return _context;
                }
                set
                {
                    _context = value;
                }
            }

            public void ProcessRequest(HttpContext context)
            {
                Context = context;
                string filePath = context.Request.QueryString["path"];
                filePath = context.Server.MapPath(filePath);

                if (filePath == null)
                {
                    return;
                }

                System.IO.StreamReader streamReader = new System.IO.StreamReader(filePath);
                System.IO.BinaryReader br = new System.IO.BinaryReader(streamReader.BaseStream);

                byte[] bytes = new byte[streamReader.BaseStream.Length];

                br.Read(bytes, 0, (int)streamReader.BaseStream.Length);

                if (bytes == null)
                {
                    return;
                }

                streamReader.Close();
                br.Close();
                string fileName = System.IO.Path.GetFileName(filePath);
                string MimeType = GetMimeType(fileName);
                string extension = System.IO.Path.GetExtension(filePath);
                char[] extension_ar = extension.ToCharArray();
                string extension_Without_dot = string.Empty;
                for (int i = 1; i < extension_ar.Length; i++)
                {
                    extension_Without_dot += extension_ar[i];
                }

                //if (extension == ".jpg")
                //{ // Handle *.jpg and
                //    WriteFile(bytes, fileName, "image/jpeg jpeg jpg jpe", context.Response);
                //}
                //else if (extension == ".gif")
                //{// Handle *.gif
                //    WriteFile(bytes, fileName, "image/gif gif", context.Response);
                //}

                if (HttpContext.Current.Session["User_ID"] != null)
                {
                    WriteFile(bytes, fileName, MimeType + " " + extension_Without_dot, context.Response);
                }
                else
                {
System.Web.UI.ScriptManager.RegisterStartupScript(this, this.GetType(), "MyMethod", "alert('You Can Not Download - pzl Login First');", true);
                }
            }

            private void WriteFile(byte[] content, string fileName, string contentType, HttpResponse response)
            {
                response.Buffer = true;
                response.Clear();
                response.ContentType = contentType;

                response.AddHeader("content-disposition", "attachment; filename=" + fileName);

                response.BinaryWrite(content);
                response.Flush();
                response.End();
            }

            private string GetMimeType(string fileName)
            {
                string mimeType = "application/unknown";
                string ext = System.IO.Path.GetExtension(fileName).ToLower();
                Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
                if (regKey != null && regKey.GetValue("Content Type") != null)
                    mimeType = regKey.GetValue("Content Type").ToString();

                    return mimeType;
                }

                public bool IsReusable
                {
                    get
                    {
                        return false;
                    }
                }
            }
        }

все в порядке с этим обработчиком, но я хочу показать предупреждение моим пользователям, если Session ["User_ID"] равен Null!
так что моя проблема в строке ниже:

System.Web.UI.ScriptManager.RegisterStartupScript(this, this.GetType(), "MyMethod", "MyMethod();", true); 

и эта строка содержит ошибку в этом хадлере!
Как я могу вызвать такие эти методы javascript в HandlerForRepeater.ashx?

заранее спасибо

1 Ответ

1 голос
/ 11 октября 2011

Это следует делать со страницы, на которой находится управление вашим репитером, а не обработчик.В приведенном ниже коде для страницы с повторителем:

if(HttpContext.Current.Session["User_ID"] != null)
{
    Response.Redirect("~/HandlerForRepeater.ashx?path={FilePath}");
}
else
{
    ClientScript.RegisterStartupScript(this.GetType(), "MyMethod", "MyMethod();", true);
}

Вы можете просто вывести файл с этой страницы, но при этом стараться как можно больше придерживаться текущего примера.

...