int.TryParse不适用于IE或Edge发布的值

时间:2016-09-23 08:21:36

标签: c# asp.net-mvc-4 internet-explorer

我对这个问题感到十分愚蠢。 我在MVC应用程序中有简单的C#代码,我需要将字符串视为有效的int,另一个字符串作为有效的DateTime。从Chrome,Opera,Firefox调用应用程序时,一切正常。但是当从IE或Edge(在多台PC上)调用applicatin时,评估失败。

我的代码:

if(!int.TryParse(s, out i))
   {
        // something
   }

我尝试过没有效果的CultureInfo和NumberFormatInfo。 字符串值 niether null也不为空,并且包含文本格式的int值。 将字符串作为DateTime进行评估也是同样的行为。 真的不知道问题出在哪里...... 谢谢你的帮助。

整码: 1.Controller

    [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;
        }
    }
  1. 的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(");
    
                }
        });
    
  2. 另一个有趣的观点。我跟踪了Fiddler的页面。 Google中的GET请求(由AJAX调用)显示正常:/ RatingDetail / 69 / 0_00_01 / 4 但在Edge:/ RatingDetail / 70 /%E2%80%8E0%E2%80%8E_%E2%80%8E00%E2%80%8E_%E2%80%8E05 / 9 URL在控制器中自动解码,但可能以某种方式数字不再是数字......

1 个答案:

答案 0 :(得分:1)

我发现了罪魁祸首...... 我创建了一个数组,形成了我需要评估为int的字符串,我看到来自IE或Edge 的响应有更多字符然后来自Chrome / Opera / Firefox的响应。 来自 IE的回复添加了引号字符。 你可以看到图片。 对于IE,输入字符串为0:00:10,对于Chrome,输入字符串为0:00:12。

Response from Chrome - everything OK:

Response from IE/Edge - added quotation marks chars

如您所见,我无法使用包含额外引号的字符串制作时间跨度(或日期时间)格式。但是在调试之前,这是不可见的,直到我做了一个char数组......

所以我必须解决方法并清除额外的引号字符。

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;
    }