我正在重构一些最初使用 POST'ed表单数据的MVC代码。使用jquery的serialize()方法对表单的字段进行序列化,并将其发送到MVC控制器“保存操作”,根据需要检查事物并重定向(如果表单值出错,则重定向到编辑操作,如果没有,则保存并重定向到显示操作)。所有操作都通过AJAX调用并返回部分视图。一切都很棒。注意:该站点使用基于AD的授权,因此在首次加载站点时会提示用户输入其Windows凭据,但不会再次提示用户。
但是,我现在希望通过JSON对象而不是表单字段与服务器进行交互。当然,我在客户端上序列化JSON对象,并借助于导入的MVC2 Futures / MVC3类JsonValueProviderFactory
,能够正确建模将发送的JSON对象绑定到Controller参数中的C#类。
我保持相同的逻辑,但当我尝试在Controller接受JSON对象时返回RedirectToAction ActionResult时,事情开始爆发。我失去了身份验证,再次提示用户输入他们的凭据,我发现自己处于最初请求的Action(保存)的无限循环中。每次提示用户输入凭据时,只需再次运行“保存操作”。用户的最终结果是提示登录凭据的无休止警报。在RedirectToAction调用中指定的任何操作都没有被命中。
原始请求使用JSON contentType的事实是否会干扰RedirectToAction的行为?这是我唯一能想到的,因为它在我不使用JSON发布时工作正常当我返回PartialViews而不是使用RedirectToAction时,它工作正常。 Controller Action的无限重复和授权凭证的不断丢失似乎表明RedirectToAction不是这种情况下的方法。
我可以根据要求发布代码。我也成功地处理了将ModelState复制到TempData和其他RedirectToAction技巧之类的东西。同样,它在使用非JSON解决方案时也能正常工作。非常感谢任何见解!!
使用后续信息进行编辑:
事实证明,即使我完全禁用网站的NTLM身份验证/授权,我也会收到“未经授权”错误。 IIS服务器不寻找任何授权,网站不寻找任何授权,但尝试使用JSON contentType请求重定向时的错误仍然发生并抱怨“未经授权”。这是WEIRD。
答案 0 :(得分:0)
为了更新所有人,我还没有找到解决方案,也不知道情况如何。但是,我愿意打赌它与RedirectToAction发出http GET请求以及我重定向到仅接受POST的操作有关。即使我删除了限制,它仍然发送JSON数据,它仍然需要通过POST完成。
简而言之,带有JSON数据的RedirectToAction似乎从根本上是可撤销的。您需要POST JSON数据,但RedirectToAction会发出GET请求。这至少是我的理论。 =)