int.TryParse不能处理IE或Edge发布的值

本文关键字:Edge TryParse 不能 处理 IE int | 更新日期: 2023-09-27 18:08:38

面对这个问题,我觉得自己很愚蠢。我在MVC应用程序中有简单的c#代码,我需要评估字符串作为有效的int和另一个字符串作为有效的DateTime。当从Chrome, Opera, Firefox调用应用程序时,一切都很好。但是当从IE或Edge(在多台pc上)调用应用程序时,评估失败。

我的代码:
if(!int.TryParse(s, out i))
   {
        // something
   }

我试过使用CultureInfo和NumberFormatInfo没有效果。字符串值既不是空也不是空,包含文本格式的int值。将string求值为DateTime也有同样的行为。真的不知道问题出在哪里…谢谢你的帮助。

整个代码:1.控制器

    [HttpGet]
    [Route("RatingDetail/{ratingID:int}/{time}/{value:int}")]
    public JsonResult RatingDetail(int ratingID, string time, int value)
    {
        try
        {
            using (var context = new SenzorikaEntities())
            {
                var rd = new RatingDB();
                //  URL must not contain ':', so we are sending time 
                //  in format 0_00_00 instead of 0:00:00.
                //  So we have to replace back...
                time = time.Replace('_', ':');
                //  This line fails when browsing in IE
                //  and yes sould by .TryParse, I know
                var timeDB = DateTime.Parse(System.DateTime.Now.ToShortDateString() + " " + time);
                var detialID = rd.InsertRatingDetail(context, ratingID, timeDB, value);
                return Json(detialID, JsonRequestBehavior.AllowGet);
            }
        }
        catch (Exception ex)
        {
            ErrorLog.LogError(ex, "Error when saving values.");
            throw;
        }
    }
Javascript
  • function saveRating(percent, time) {
            // model ID
            var rid = $("#RatingID").val();
            var timeConvert = time.replace(':', '_').replace(':', '_');
    } 
    
    
    $.ajax(
        {
            statusCode: {
                500: showError('some error text'),
                200: showError('')
            },
            url: '/RatingDetail/' + rid + '/' + timeConvert + '/' + percent,
            async: true,
            type: 'GET',
            dataType: 'json',
            success:
            function (response) {
                if (response == undefined || response == "0")
                    showError('some error text');
            },
            error: 
                function (response) {
                    showError(");
                }
        });
    
  • 还有一点很有趣。我通过提琴手追踪页面。Google中的GET请求(由AJAX调用)显示正常:/RatingDetail/69/0_00_01/4但是在Edge:/RatingDetail/70/%E2%80% 8e02 %80%8E_%E2%80% 8e002 %80%8E_%E2%80%8E05/9中URL在控制器中自动解码回来,但可能不知怎的数字不再是数字…

    int.TryParse不能处理IE或Edge发布的值

    我找到了罪魁祸首…我做了一个数组形式的字符串,我需要评估为int,我看到IE或Edge 的响应有更多的字符然后从Chrome/Opera/Firefox的响应。来自IE的响应添加了引号字符。你可以在图片中看到。IE的输入字符串为0:00:10,Chrome的输入字符串为0:00:12。

    Chrome的响应-一切正常:

    IE/Edge响应-添加引号字符

    如您所见,我无法从包含额外引号的字符串中创建时间跨度(或日期时间)格式。但这在调试时是不可见的,直到我做了一个字符数组…

    所以我必须解决这个问题,并清除额外的引号字符。

    public static string IEHackforTime(string time)
        {
            string newTime = "";
            var arr = time.ToCharArray();
            foreach( var c in arr)
            {
                if (Char.IsNumber(c) || c==':' )
                {
                    newTime += c.ToString(); // No need of StringBuilder, array is small enough
                }
            }
            return newTime;
        }