【问题标题】:Why aren't my links taking me into my controller?为什么我的链接没有带我进入我的控制器?
【发布时间】:2017-08-17 17:45:24
【问题描述】:

我想我并不完全理解 urls 如何与 C# 项目一起工作,因为我不知道如何指定一个 url 来通过控制器而不仅仅是返回一个 aspx 页面。

假设我正在尝试通过名为“ScholarshipController.cs”的控制器访问我的项目的索引页面。我想在这个控制器中点击 Index 方法/动作,我的 url 如下(我的应用程序的名称是“TuitionAssistance”fyi):

http://localhost/TuitionAssistance/Scholarship/Index

但是,运行此 url 只会返回位于“Scholarship”视图文件中名为“Index.aspx”的 aspx 页面,而无需点击控制器。为什么会发生这种情况?如何让它通过控制器,以便索引页面在加载时会加载适当的信息?

抱歉,这是一个愚蠢的问题。任何见解将不胜感激。谢谢!

Route.config:

using System.Web.Mvc;
using System.Web.Routing;

namespace ScholarshipTuitionAssistance
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            /* Scholarship */

            /* Scholarship */
            //routes.MapRoute("TuitionAssistance",
            //    "tuition/{name}",
            //    new { controller = "TuitionAssistance", action = "Index", name = "" });

            routes.MapRoute(
                name: "TuitionAssistance",
                url: "{controller}/{action}/{employee_number}",
                defaults: new { controller = "Home", action = "TuitionAssistance", employee_number = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Scholarship",
                url: "{controller}/{action}/{employee_number}",
                defaults: new { controller = "Home", action = "Scholarship", employee_number = UrlParameter.Optional }

            );

            routes.MapRoute(
                name: "Details",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Scholarship", action = "Details", id = UrlParameter.Optional }
            );

        }
    }
}

【问题讨论】:

  • 向我们展示 RouteConfig 类。它应该在 App_Start 文件夹中。
  • 刚刚添加到我的帖子中。谢谢
  • 我很犹豫要不要碰任何东西,因为一切似乎都在生产中。只是当我尝试在本地运行时它吐在我的脸上......
  • 所有 3 条路由都是相同的,因为它们接受 0 到 3 个段。第 2 和第 3 路由定义毫无意义,因为它们永远不会被执行(任何匹配它们的 url 也将匹配第 1 路由)。而且您显示的所有路线都不会与您显示的网址匹配。
  • 谢谢!我以前从未使用过路线,所以这是我希望得到的信息!

标签: c# asp.net-mvc-4 web controller


【解决方案1】:

您的路由 (URL) 无法匹配文件系统上实际存在的任何内容。在您的示例中,您显然有一个文件[document root]\Scholarship\Index.aspx。因此,对Scholarship/Index 的请求将返回该文件,而不是调用 ASP.NET MVC 机制来加载控制器操作。

【讨论】:

  • 我不确定这是否是问题所在。因为,Index.aspx 的实际位置是 [文档根目录]\Views\Scholarship\Index.aspx 这会改变什么吗?还是您仍然认为这会是一个问题? “动作名称”是否需要与“视图/页面名称”相同才能返回适当的视图?我需要更改控制器名称吗?
  • 哦。是的,这也是一个有趣的场景。所以在那里,MVC 被调用,但由于它支持在 MVC 站点中使用 Web 窗体的方式,它将直接加载视图而不是尝试呈现操作。 aspx 文件的存在基本上会缩短请求处理的其余部分。无论如何,同样的解决方案适用,您的路线需要与任何物理 aspx 文件不同。
  • 抱歉,这让我很困惑。我认为操作应该与 aspx 文件命名相同,并且控制器应该与该文件所在的视图文件夹具有相同的名称?在不搞砸的情况下,我将如何创建一个指向视图文件的不同路径?
  • 动作的名称应与 cshtml 相同。 Aspx 文件是独立的,不使用控制器和操作之类的东西。
【解决方案2】:

在 MVC ASP.NET 中,将这些类型的链接视为在控制器中调用方法的一种方式。当访问该链接时,您的控制器会执行一堆垃圾操作,然后返回 ActionResult(或其他内容)。这个ActionResult,为了便于解释,是写在相应视图文件中的标记。控制器->index() 将返回views->controller 下名为index 的视图。如果您想将信息传递给您的视图,您需要将一个包含所有信息的模型从您的索引控制器传递给视图(返回 View(MyFancyModel))。该视图将在顶部有一条剃刀线,例如:@model The.Namespace.Wherever.my.model.is

Visual Studio 中专门针对索引页面的脚手架控制器和视图,仅传递相应数据库中的项目列表。

【讨论】:

  • 感谢您的解释!我从来没有见过有人说得这么清楚。过去我不得不对这些事情做出假设。我很感激!
  • 没问题。老实说,我有点担心我在发布答案后误解了你的问题。这是你想知道的还是我完全错过了钉子?
  • 哈哈,我的意思是你解决了我一半的问题。我希望得到一个明确的答案,说明 url 如何与 C# 中的控制器一起工作(你给了我)。但是,我仍然需要弄清楚为什么在这种特殊情况下我没有击中我的控制器。我还是想不通。
  • 在这些情况下我喜欢做的一件事是:导入 System.Windows.Forms .dll,然后在我的控制器方法中调用 MessageBox.Show("I made it here")。这将为您提供一个可靠的方法来判断您的问题是在控制器方法返回行中还是在您尝试访问控制器的方式中
  • 在调试模式下在控制器中添加断点会完成同样的事情吗?还是使用消息框有什么特别之处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
相关资源
最近更新 更多