很长一段时间,我有一个回归的行动
return RedirectToAction("Index","Vendor");
它按预期工作。完成此功能后,我的Index函数被调用。
然而,最近它停止了工作。同一行代码现在将浏览器定向到网址localhost:67676/Vendor/
,我的Index()
操作永远不会被调用,页面会显示:
HTTP错误403.14 - 禁止
Web服务器配置为不列出此目录的内容。
但是,如果我向方法参数添加正斜杠,如
return RedirectToAction("/Index","Vendor");
一切都按预期工作,并调用索引函数。
我知道为什么我现在需要使用"/Index"
,但"Index"
才能使用
答案 0 :(得分:1)
错误表示您的应用中有一个名为Vendor
的文件夹,并且该网址正在尝试导航到该文件夹而不是VendorController
。要解决此问题,请重命名该文件夹,使其与控制器名称不匹配。
要了解幕后发生的事情,
return RedirectToAction("Index","Vendor");
在内部查看匹配的路由定义,并匹配具有defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
的默认路由。由于您将"Vendor"
作为控制器传递(与默认值不匹配),因此网址的第一段变为Vendor
。并且因为您的传递"Index"
作为操作,它与路径匹配,因此不会添加其他段(不需要)。最终网址变为localhost:67676/Vendor
,与您的文件夹匹配(因此错误)。
当您使用return RedirectToAction("/Index","Vendor");
时,您的传递"/Index"
与默认操作("/Index" != "Index"
)不匹配,因此它会在网址中生成第二段,现在变为localhost:67676/Vendor/Index
因为你没有(并且不能)拥有一个名为"Vendor/Index"