我对这个问题感到十分愚蠢。 我在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;
}
}
的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(");
}
});
另一个有趣的观点。我跟踪了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在控制器中自动解码,但可能以某种方式数字不再是数字......
答案 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;
}