【问题标题】:ASP.NET MVC 5, IIS Express 8 - not hitting indexASP.NET MVC 5、IIS Express 8 - 未命中索引
【发布时间】:2015-03-05 10:10:44
【问题描述】:

我用 Index 方法得到了一个控制器(名为 DeficienciesController)

public ActionResult Index(int? deficiencyReviewId)
        { 
           return View();
        }

但是当我在 IIS Express 8 中本地运行应用程序时,它不会点击 Index 方法,而是会获得状态代码 301,并且浏览器会在 url 中添加 /。

奇怪的是,当我将网站发布到网络服务器时,它运行得非常好.. 当使用 Html.ActionLink 它的 a 标签看起来像这样:

<a href="/Deficiencies">Deficiencies</a>

所以我希望它链接到:http://localhost:49440/Deficiencies

但是当我点击它时,它会变成:http://localhost:49440/Deficiencies/

IIS 给了我一个“HTTP Error 403.14 - Forbidden”页面,因为它正在尝试浏览文件夹内容..控制器操作没有被调用..

如果我将属性路由添加到控制器和操作,一切正常,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 });
}

Index 动作是控制器中唯一不起作用的动作,其他动作完全正常。

编辑:

我希望我能返回一个解决方案,但我唯一可行的解​​决方案是将项目从源代码控制拉到一个新位置,然后删除操作中的 int 值。然后Index页面工作了..然后我做了一个新的动作,它采用了defectiveReviewId int..所以我真的没有找出问题所在,但它一定是我电脑的本地问题,因为我的同事得到了它工作..

【问题讨论】:

  • 尝试将您的变量defectiveReviewId 重命名为“id”。
  • 我刚试过。我期待带有 ID 的 ActionLink 看起来像这样:http://.../Deficiencies?Id=9,但现在它看起来像 http://../Deficiencies/Index/9。除了没有ID的页面仍然给出错误403.14。

标签: c# asp.net-mvc iis-7 asp.net-mvc-5


【解决方案1】:

在您的路线中,您设置了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>

【讨论】:

  • 这是一个很好的建议,但这仍然会导致在 URL 末尾附加 /,并显示 403.14 页面。网址最终如下所示:/Deficiencies/?deficiencyReviewId=9。但我肯定会保留'= null'。
  • @MartinM 抱歉,我错过了你问题的那一部分。查看我的编辑
  • 不用担心,但是我刚刚尝试了您编辑的代码,但这也不起作用。我的同事刚刚尝试在本地运行它,并且成功了。所以现在我正试图将项目从源代码控制中拉到一个新位置。
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多