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,我看到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;
}