【问题标题】:How does ASP.NET MVC associate page names with class names?ASP.NET MVC 如何将页面名称与类名称相关联?
【发布时间】:2016-08-22 22:06:02
【问题描述】:

我是 ASP.NET MVC 的新手,我很困惑在像 C# 这样的编译语言中,类名在项目构建后如何具有任何意义。有人可以向我解释一下构建过程是如何进行的

public class SomePageController : Controller {
     public ActionResult Index() { return View(); }
}

并获取名称SomePageIndex 以创建调用函数Index() 的URL 映射SomePage/Index?我只有在有一些其他 C# 文件能够以某种方式查看从 Controller 类派生的所有类并获得一个不带后缀 "Controller" 的名称的字符串时才能理解它是如何工作的。但这对来自 C++ 背景的我来说似乎很奇怪,因为我从未见过一种语言可以使用引用自己名称的变量的方式,也从未见过一种遍历从某个类派生的所有类的方法。

也许有人可以告诉我如何编写一个像这样的 C# 程序

public class SomePageController : Controller {
     public ActionResult Index() { return View(); }
}

public class SomeOtherPageController : Controller {
     public ActionResult Index() { return View(); }
}

public void printPageNames ( void )
{
    // ... Will print "SomePage, SomeOtherPage" to the console
}

【问题讨论】:

  • 映射到页面与 URL 的关系不大。 URL 映射到控制器上的操作方法,通过基于约定的路由或属性路由。然后通过操作方法选择视图。要查看框架查找视图的位置,只需删除视图并点击 Action Method。系统会方便地向您显示它寻找视图的地点列表。
  • TBH 它比任何编程魔术都更符合惯例——就像@mason 说的那样。当你有像 /client/view 这样的 URL 并且约定没有被覆盖时,应用程序会在 Views/Client/View.cshtml 中查找视图文件(因为它应该对应于 Views/Controller/Action.cshtml)。

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


【解决方案1】:

您需要阅读的是Reflection。它允许您查看程序集中的所有类、属性等。

要直接回答您的问题,Jon Skeet has the starting point 如何完成此操作。

您的代码将如下所示:

var assembly = Assembly.GetExecutingAssembly();

foreach (var controller in assembly.GetTypes().Where(a => a.Name.EndsWith("Controller"))
{
    Console.WriteLine(controller.Name.TrimEnd("Controller"));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-15
    • 2020-07-17
    • 2020-12-19
    • 2021-02-13
    • 1970-01-01
    • 2011-01-03
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多