如何处理asp.net Httphandler中的错误? - javascript

我在asp.net中有Httphandler返回文件。在代码中,我有Response.AddHeader("Content-Disposition", "attachment; filename=somefile.ext");,因此页面URL保持不变。
但是,如果Httphandler URL中出现错误,则变成类似http://localhost:55161/document.axd之类的东西,并且我屏幕变白。

我如何在不刷新页面的情况下从Httphandler返回例如JavaScript警报?像这样:

public class Document: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        HttpRequest Request = context.Request;
        HttpResponse Response = context.Response;

        //Response.AddHeader("Content-Disposition", "attachment; filename=somefile.ext");
        Response.ContentType = "application/javascript";
        Response.Write("<script type ='text/javascript'>alert('Error!');</script>");

    }

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

PS对不起我的英语,我不是母语人士:)

参考方案

我认为您做错了。您不应该从http处理程序返回javascript。它们旨在用于处理数据。应基于Httphandler执行的结果显示警报。

您可以做的是将try catch块放在http处理程序中,如果有异常,则返回特定的代码。然后在您的JavaScript中-检查该代码-并显示警报。

下来,您可以找到我在这种情况下使用过的东西。它将为您提供一个想法-您有一个单独的类,其中包含执行结果-并返回易于通过javascript处理的JSON。

        public void ProcessRequest(HttpContext context)
        {
            var result = new HandlerResult();
            var resultJson = string.Empty;
            var reqDictionary = Helper.DecryptQueryParams(context);

            try
            {
                if (!Helper.AllQueryParametersExists(reqDictionary, "userid", "topN", "time", "latitude", "logitude", "shareLocation"))
                {
                    _log.Error("Incomplete query string parameters!");

                    throw new Exception("Incomplete query string parameters!");
                }

                Guid userId;
                Guid.TryParse(reqDictionary["userid"], out userId);
                int topN;
                int.TryParse(reqDictionary["topn"], out topN);

                double minutes;
                double.TryParse(reqDictionary["time"], out minutes);

                var time = DateTime.Now.AddDays(-minutes);

                double latitude;
                double.TryParse(reqDictionary["latitude"], out latitude);
                double logitude;
                double.TryParse(reqDictionary["logitude"], out logitude);
                bool shareLocation = Helper.ParseInt(reqDictionary["sharelocation"]);

                var finalTime = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, 0);

                var users = _userAccessor.Repo.FindUsers(userId, topN, finalTime, latitude,
                    logitude, shareLocation);

                var sb = new StringBuilder();

                var list = new List<UserLocation>();
                foreach (var user in users)
                {
                    var userLocation = new UserLocation
                    {
                        UserId = user.Id,
                        UserName = user.Email,
                        FullName = user.FullName,
                        Gender = user.Gender,
                        Age = user.Age,
                        Latitude = user.Latitude,
                        Longitude = user.Longitude,
                        Time = user.Time
                    };

                    list.Add(userLocation);
                }

                context.Response.Write(sb.ToString());


                result.Result = string.Empty;
                result.ResultStatus = HandlerResult.Status.Successful;
                resultJson = JsonConvert.SerializeObject(list);
                _log.Info("OK");
            }
            catch (Exception ex)
            {
                result.ResultStatus = HandlerResult.Status.Error;
                result.Result = ex.Message;
                resultJson = JsonConvert.SerializeObject(result);
                _log.Error(ex);
            }
            finally
            {
                context.Response.Clear();
                context.Response.ContentType = "text/plain";
                context.Response.Write(resultJson);
                context.Response.Flush();
                context.Response.End();

                _log.Info(resultJson);
            }
        }


   public class HandlerResult
    {
        public string Result { get; set; }

        public Guid UserId { get; set; }

        public Status ResultStatus { get; set; }

        public HandlerResult(Status resultStatus, string result)
        {
            this.ResultStatus = resultStatus;
            this.Result = result;
        }

        public HandlerResult(string result)
        {
            ResultStatus = Status.Novalue;
            this.Result = result;
        }

        public HandlerResult()
        {

        }

        public enum Status
        {
            Novalue = 0,
            Successful = 1,
            Error = 2,
            Notvaliduser = 3,
            Successfulupdate = 4,
            UserExists = 5,
            UserNotConfirmed = 6
        }
    }

javascript popupwindow之后的行如何工作? - javascript

好的,我有一个来自后面代码的方法,可以创建一个popupwindow。然后有一行代码要在那之后执行,我想知道那行代码何时执行,是在使用popupwindow之后执行还是在创建popupwindow之后执行?例如:void exPopupWindowMethod() { string scr = "window.open('exampleP…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

.NET C#Webbrowser填充输入,不带ID或类名 - javascript

我需要在网络浏览器中填写一个输入,但这不起作用。我认为必须使用name属性来完成,但是怎么做呢?foreach (HtmlElement login in webBrowser1.Document.GetElementsByTagName("input")) { if (login.GetAttribute("name"…

获取JavaScript值到C#字符串 - javascript

                        是否可以在C#中执行类似的操作?该值为“ 10/05/2014”string jsValue = javascript("$('#EstimatedStartDate').val()"); 参考方案 您能否更详细地阐明您要做什么。看来您正在尝试从javascript(客户…

ASP.NET-如何更改JSON序列化的方式? - javascript

我正在使用ASP.NET通过以下查询返回Json文件:public ActionResult getTransactionTotals(int itemID) { DBEntities db = new DBEntities(); var query = from trans in db.Transactions // Linq query removed …