我有一个带有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>

07-26 02:35