gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 中的约定有多灵活?

转载 作者:行者123 更新时间:2023-12-02 00:42:35 25 4
gpt4 key购买 nike

具体来说, Controller 类名是否必须有 Controller 后缀,如果您愿意,是否可以在不破坏项目的情况下更改项目中的文件夹结构?

是否有其他约定可以被覆盖,如何覆盖?

最佳答案

只要您了解框架的运作方式,大多数约定都是可塑的。让我们来解决两个最大的约定:

  1. 用于从路由实例化 Controller 的“{controller}/{action}/”魔术关键字

  2. 框架首先在 Controller 目录中搜索 View ,然后在共享目录中搜索 View 的方式。

默认情况下,您创建的每个路由都与 MvcRouteHandler 对象的实例相关联。当路由匹配时,将调用该处理程序来处理传入的请求。下面是 MvcHandler 的 ProcessRequest 的样子:

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
this.AddVersionHeader(httpContext);
string requiredString = this.RequestContext.RouteData.GetRequiredString("controller");
IControllerFactory controllerFactory = this.ControllerBuilder.GetControllerFactory();
IController controller = controllerFactory.CreateController(this.RequestContext, requiredString);
if (controller == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.ControllerBuilder_FactoryReturnedNull, new object[] { controllerFactory.GetType(), requiredString }));
}
try
{
controller.Execute(this.RequestContext);
}
finally
{
controllerFactory.ReleaseController(controller);
}
}

注意硬编码字符串“controller”。好吧,如果您想编写自己的 Controller 查找逻辑代码,您可以将此处理程序替换为您喜欢的任何路由。只需做 something like this (shameless blog plug) :

routes.Add("ImagesRoute",
new Route("graphics/{filename}", new ImageRouteHandler()));

现在当路由被匹配时,它会调用你自己的逻辑,你可以做任何你想做的事。顺便说一句,用于查找带有“Controller”后缀的 XXXXController 类的反射是 DefaultControllerFactory 对象的一部分,在上面的处理程序中调用,并且这个工厂是可替换的。

因此, Controller 选择是一种可以覆盖的约定。当您从任何 Controller 方法执行“return View()”时它会查找 View 怎么办?下面是 WebFormViewEngine 的构造函数,框架的默认 View 引擎:

public WebFormViewEngine()
{
base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.master", "~/Views/Shared/{0}.master" };
base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.aspx", "~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx" };
base.PartialViewLocationFormats = base.ViewLocationFormats;
}

因此,如果您不喜欢在 Controller 目录中查找然后共享的惯例 - 您可以轻松地扩展 WebFormViewEngine(或 use an entirely different view engine)并将其放入 global.asax:

ViewEngines.Engines.Add(new MyViewEngine());

MVC 框架的一个令人惊奇的事情是它真的很灵活。您几乎可以用自己的逻辑替换它的任何部分——并且所有代码都可以查看它们做了什么。

关于asp.net-mvc - ASP.NET MVC 中的约定有多灵活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com