【问题标题】:MVC areas and "404 resource not found" errorMVC 区域和“404 资源未找到”错误
【发布时间】:2014-11-10 22:26:25
【问题描述】:

我从一名在我加入公司之前离开公司的程序员那里继承了一个损坏的 MVC 应用程序。之前的程序员在这里的最后一次行动中,将应用程序重新组织为区域(如附加的解决方案资源管理器快照所示)。我确信这是一件简单的事情,但由于我是 MVC 的新手,目前它是一件大事:

由标记@Html.ActionLink() 生成的许多链接都可以正常工作,但有些链接失败并出现“404 资源找不到 [...]”错误。

以下是链接失败的示例:

@Html.ActionLink("Upload Documents", "BlankPageTest", new { controller = "DocumentUpload", area = "Documents" }, new { @class = "btn btn-info" })

...这是一个有效的链接:

@Html.ActionLink("Edit Questions", "ChangeQuestions", new { controller = "Account", area = "UserAccount" }, new { @class = "btn btn-info" })

这两个链接都在视图“MyAccount.cshtml”的标记中,该视图位于“UserAccount”区域。我可以看到失败的链接和有效的链接之间的唯一功能差异是工作链接的资源 (ChangeQuestions.cshtml) 与视图 (MyAccount.cshtml) 位于同一区域。但是,由于控制器和区域都是 Html.ActionLink() 的参数,我看不出 MVC 会如何混淆。

“404 资源未找到”消息中给出的完整 URL 是:

/CROMERR.Website/Documents/DocumentUpload/BlankPageTest

我在控制器中有一个名为“DocumentUpload”的目标 URL 的方法......找不到任何更明显的东西可以尝试,所以我想问问更懂行的人。任何和所有帮助表示赞赏。

DocumentAreaRegistration 包含代码:

public override string AreaName 
{ 
    get 
    {
        return "Documents"; 
    } 

} 

public override void RegisterArea(AreaRegistrationContext context)
{ 
    context.MapRoute( 
        "Documents_default", 
        "Documents/{controller}/{action}/{id}", 
        new { action = "Index", id = UrlParameter.Optional });
}

【问题讨论】:

  • DocumentsAreaRegistration 中的内容是什么,它在任何地方都被称为表单吗?
  • DavidG,DocumentAreaRegistration 包含以下代码。根据 Visual Studio,RegisterArea() 方法的引用为零。公共覆盖字符串 AreaName { get { return "Documents"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Documents_default", "Documents/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ) ; }
  • 哎呀。无法格式化回复 DavidG 中的代码。我为意大利面道歉。您指出的文件中有一种方法,但没有从任何地方调用...
  • 这就是我们编辑问题而不是在 cmets 中发布代码的原因。我已经为你添加了代码。 DocumentAreaRegistration 是否继承自 AreaRegistration? In your Application_Start` 你是在调用 AreaRegistration.RegisterAllAreas() 吗?最后,您如何将namespaces: new string[] { "Yournamespace.Areas.Controllers" } 添加到您发布的方法中的RegisterArea
  • 感谢 DavidG 的建议。 (1) 是的,DocumentAreaRegistration 继承自 AreaRegistration。 (2) Global.asax 中的Application_Start 调用AreaRegistration.RegisterAllAreas()。至于(3),我承认我有点困惑。我会在哪里添加这个?而且,更重要的是,我对通过右键单击和“添加|区域”在 MVC 项目中添加区域的印象是,这个连线都是在幕后完成的。不是这样吗?我知道我们是否只是在这里验证接线是否正确完成。感谢您的耐心等待。

标签: c# asp.net-mvc asp.net-mvc-areas


【解决方案1】:

根据您提出的上一个问题,您的问题是您的视图位于错误的位置,导致 404 错误。

DocumentUpload 控制器,您正试图返回一个视图BlankTestPage.cshtml。但是,在查看屏幕截图时,BlankTestPage.cshtml 视图实际上位于 Views/Documents 文件夹中。默认情况下,MVC 只会查看文件夹Views/ControllerName(其中控制器名称是试图返回视图的控制器的名称)和Views/Shared

如果您需要从多个控制器中引用BlankTestPage.cshtml,请将其放在共享文件夹中。否则,您需要将该视图从 Documents View 文件夹移动到 DocumentUpload 视图文件夹(屏幕截图中的空文件夹)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 2017-07-23
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2019-11-08
    相关资源
    最近更新 更多