我有一个带有Index方法的控制器(名为DeficiencyController)
public ActionResult Index(int? deficiencyReviewId)
{
return View();
}
但是,当我在IIS Express 8中本地运行该应用程序时,它不会命中Index方法,而是获得状态代码301,并且浏览器在URL中添加了/。
奇怪的是,当我将网站发布到Web服务器时,它运行得很好。
使用Html.ActionLink时,标记如下所示:
<a href="/Deficiencies">Deficiencies</a>
所以我希望它链接到:http://localhost:49440/Deficiencies
但是当我单击它时,它变为:http://localhost:49440/Deficiencies/
IIS给我一个“ HTTP错误403.14-禁止访问”页面,因为它试图浏览文件夹内容。.控制器动作未被调用。
如果我将属性路由添加到控制器和操作,则一切正常,Html.ActionLink会找到正确的路由,但这不是我想要的。
我的RouteConfig看起来像这样:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
索引动作是控制器中唯一不起作用的动作,其他动作也可以正常工作。
编辑:
我希望可以返回一个解决方案,但是我唯一可行的解决方案是将项目从源代码控制中移到新位置,然后在操作中删除int值。然后,索引页开始工作。然后,我采取了一个新的操作,该操作采取了errorsReviewId int。工作..
最佳答案
在您的路线中,您已设置id=UrlParameter.Optional
,但您正在使用deficiencyReviewId
。当您请求/deficiencies
时,实际上是在期望:/deficiencies?deficiencyReviewId=
带有int?
值。
您可以使用如下方法签名:
public ActionResult Index(int? deficiencyReviewId = null)
现在
deficiencyReviewId
是一个可选参数,因此/deficiencies
将命中您的Index
方法然后要删除结尾的斜杠,请将其添加到您的
web.config
<rewrite>
<rules>
<!--To always remove trailing slash from the URL-->
<rule name="Remove trailing slash" stopProcessing="true">
<match url="(.*)/$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>
</rules>
</rewrite>