【问题标题】:Calling controller method from view -Page not found从视图调用控制器方法 - 找不到页面
【发布时间】:2021-01-14 10:36:39
【问题描述】:

我正在尝试从 View 调用控制器方法。我尝试从 Action 链接调用它。

ActionLink 在帐户视图中:

  @Html.ActionLink(item.ClientName,"GetDetails","DetailsController", new { id = item.Id 
  }, null)

DetailsController 方法:

   public async Task<IActionResult> GetDetails(int id)
    {
      return View("ClientDetails", clientAccount);
    }

生成的网址:https://localhost:44355/DetailsController/GetDetails/1

我遇到了一个错误

找不到这个本地主机页面 没有找到该网址的网页:https://localhost:44388/DetailsController/GetDetails/1 HTTP 错误 404

我需要重定向到 clientDetails 视图并显示数据 我可以这样打电话吗?有没有更好的方法?

文件夹结构

【问题讨论】:

  • 帐户视图是否位于其他区域?请分享您的解决方案的文件夹结构
  • 已附加。我应该在 clientDetails 控制器中添加任何路由吗?
  • 您应该在视图文件夹中为每个控制器添加具有相同名称的控制器的文件夹,例如对于 AccountController,您应该在 Views 文件夹中有一个名为“Account”的文件夹,该文件夹将包含帐户控制器操作方法的所有视图跨度>
  • 我为视图创建了一个单独的文件夹。现在页面正在加载。但是css、bootstrap等文件没有加载(404错误)。它正在尝试从localhost:44388/ClientDetails/GetClientDetails/css/…加载。如果我直接加载页面(localhost:44355/clientdetails)样式没有破坏
  • @Reshma,对于静态文件404错误,默认情况下,在asp.net核心应用中,静态文件存放在项目的wwwroot目录下。从屏幕截图中,您似乎正在创建一个 Style 文件夹。所以我假设这些文件可能存储在 web 根目录之外,并且您已经更改了默认的静态文件目录,对吗?如果更改它,则必须更改这些文件路径(在您的视图页面和布局页面中)。更多详细信息,请查看Static files in ASP.NET Core

标签: asp.net-core model-view-controller url-routing


【解决方案1】:

@Ryan 注意到 ActionLink 定义中有一个错字。将控制器名称从“DetailsController”更改为“Details”

应用程序在视图文件夹中查找具有控制器名称的文件夹中的视图。在此之后查看共享文件夹。将视图放在 Views 文件夹中的控制器名称是一种更好的方法。但是如果你需要做一些例外,你可以指定视图的整个路径:

return View("~/Views/ClientAccount/ClientDetails.cshtml", clientAccount);

或将视图放在共享文件夹中。

【讨论】:

  • 它会起作用,但我不建议这样做,因为这不是一个好的约定,最好将 ClientDetails 视图移动到与控制器 ClientDetails 同名的文件夹
  • 但问题实际上出在路由(HTTP 404)上,而不是 .cshtml 文件位置,不是吗?需要将锚链接中的控制器名称更改为:Details,而不是DetailsController。这种命名约定与 MVC 本身一样古老。奇怪的是没有人注意到这一点。
  • 是的,你是对的。我没有注意到这一点,但在此之后它会给出一个页面例外。
【解决方案2】:

找不到此本地主机页面 没有找到该网络的网页 地址:https://localhost:44388/DetailsController/GetDetails/

对于这个问题,从文件夹结构来看,您的应用程序中似乎有一个 ClientDetails 控制器,而不是“Detail”控制器。

所以,当你创建超链接时,控制器名称应该是“ClientDetails”,而不是“ClientDetailsController”,代码如下:

@Html.ActionLink(item.ClientName,"GetDetails","ClientDetails", new { id = item.Id}, null)

那么,我假设GetDetails方法在ClientDetails控制器中,ClientDetails.cshtml页面在Views/ClientAccount文件夹中,如果是这样的话,我们应该使用下面的代码来分配视图页面。

    public async Task<IActionResult> GetDetails(int id)
    { 
        var clientAccount = items.Where(c=>c.Id == id).FirstOrDefault();
        return View("~/Views/ClientAccount/ClientDetails.cshtml", clientAccount);
    } 

因为如果使用return View("ClientDetails", clientAccount);,它会从Views文件夹中的文件夹(名称与控制器名称相同)中找到ClientDetails视图页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2020-11-22
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多