我不能完全弄清楚为什么不同的浏览器会导致服务器代码的功能不同,但在 IE 中我得到了InvalidOperationException
,而它在 Chrome 和 Firefox 中完美运行。
(对于 Facebook 选项卡应用程序HomeController
,其中某些类型已被重命名以混淆客户端名称)中的代码如下:
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult Index()
{
Nullable<long> facebookUserID = GetFacebookIDOrRedirect();
Start start = new Start();
start.FacebookUserID = facebookUserID;
// More properties are set here...
if (MyUser == null)
{
CurrentMyUser = new MyUser
{
UserID = Guid.NewGuid(),
FacebookUserID = facebookUserID,
Answers = new Dictionary<int, Answer>()
};
}
else { start.SomeProperty = MyUser.SomeProperty; }
ViewData.Model = start;
// Some things are added to the ViewBag here.
return View();
}
现在 Chrome 和 Firefox 正确地进入下一个方法:
[HttpPost]
public ActionResult Start(Start model)
{
if (ModelState.IsValid)
{
if (CurrentMyUser == null) return View();
MyUser myUser = (MyUser) Session["MyUser"];
myUser.SomeProperty = model.SomeProperty;
// More properties are set here...
return RedirectToAction("Question", "MyController", new { id = 1 });
}
return View();
}
URL 为http://domain.com/MyController/Question/1
. 但是,在同样的情况下,IE 正在尝试访问http://domain.com/Home/Start
看在Global.asax.cs
里面,没有提到Start
;唯一提到的HomeController
是下面,应该被称为路线:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
// Parameter defaults
);
routes.MapRoute(
"FeedingTimes", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "FeedingTimes", action = "Question", id = 1 }
// Parameter defaults
);
Fwiw,我可以看到它工作的浏览器版本是最新的 Chrome (19.0.1084.46 m),它在 Internet Explorer 9.0.8112.16421 中失败。我们的 QA 人员告诉我它在 Firefox 中工作正常,我不确定他们使用的是哪个 IE 版本,但他们已经去吃午饭了,所以我不能问。
这似乎与Internet Explorer 7 + MVC 3 = bad urls 不是同一个问题?或者作为MVC、IMG 标记、Url.Action 和 TempData 的 IE9 意外行为——在 Fiddler 中查看,我只收到一个请求:(POST /Home/Start HTTP/1.1
使用我希望看到的 POSTdata)。但我不明白为什么 IE 会以不同的方式做这件事(或者为什么服务器代码甚至会知道浏览器版本!)
任何想法都非常感激。