我正在过渡到在项目中使用Areas,每次创建一个新项目时,都必须更改一些内容以使其适合我希望工作的方式。更改涉及:
我宁愿不必在每次创建新区域时都做同样的事情,因为我担心公约会被遗忘,某些事情会变得混乱。有没有办法修改“新建”>“区域”的默认值?还是有可能制作一个新的文件模板来实现我想要的功能?
我正在过渡到在项目中使用Areas
我已经做了几个月类似的事情,但是从一个旧的WebForms项目开始,通过VS 2013的Add -> New Scaffolded Item...
功能添加MVC组件,以便在服务器端利用MVC的结构和路由。我还一直在服务器端合并WebAPI和SignalR。我绝对仍然是一个初学者,但是在类似的过程中可能会更进一步,这里是我关于您要实现的目标的一些想法和问题:
- 删除创建的文件夹之一
- 稍微修改web.config文件
- 添加一两个带有默认值的新文件
您正在开发什么环境?例如,如果您使用的是VS 2013的脚手架,则很可能可以修改T4模板以防止或重定向文件夹,类等的创建。这是一篇介绍您可以在其中找到这些模板的文章,而这只是T4的众多介绍之一。计算机上模板的路径将根据VS版本而有所不同。通过修改或创建新模板,您应该能够相对容易地完成上述所有三个方面。如果您在这样的环境中工作,我将尝试详细说明如何修改现成的模板(可能已经有很多文章可供您参考,尽管它们可以做得更好)。
- 略微修改AreaRegistration文件
如果您使用的是MVC 5或更高版本,则建议使用属性路由。在API范例中工作时,这似乎更标准(从继承而来,ApiController
而不是Controller
),但是我发现将其扩展到传统的MVC控制器非常有用。
假设使用MVC 5,我建议您修改AppStart\RouteConfig.cs
的RegisterRoutes()
方法,以启用属性路由,然后添加一个包罗万象的路由,例如:
routes.MapMvcAttributeRoutes();
routes.MapRoute(
"NotFound",
"{*url}",
new {
controller = "Error",
action = "Index"
});
到那时,我将删除xAreaRegistration.cs文件,并删除对RegisterAllAreas()
from的调用Global.asax
,但是您不必走太远。然后,根据需要使用属性来装饰控制器的类(无论它们位于何处)及其方法。使用属性路由,我已经摆脱了传统的MVC约定。我仍然可以依靠他们,但是我可以将控制器放置在项目中的任何位置,并轻松定义其动作的路线。
话虽这么说,您可能应该遵循一些针对类似路线的组织的组织标准,这样随着项目的发展,您不会发现自己浪费大量时间来寻找与某些路线相匹配的所有控制器/动作。
这是一个简单的示例,说明了它实际上是如何从URI转换为方法调用的:
如果我有控制器ctl
与动作act
,逻辑上区ar
的URI的存在http://localhost/ar/ctl/a/1
,将被路由到MyControllerNameDoesNotMatter.Index(1)
,下面,通过使用属性装饰,如:
[RouteArea("ar")]
[RoutePrefix("ctl")]
public class MyControllerNameDoesNotMatter : Controller {
...
[Route("a/{optionalParamDefaultsToNegativeOne=-1}")]
public ActionResult Index(int optionalParamDefaultsToNegativeOne) {
...
}
}
这种查看Area的方式比物理方式更具逻辑性,因为MyControllerNameDoesNotMatter.cs
文件不必位于Area\ar\Controllers
文件夹中。自从采用此方法以来,我实际上已经不再使用Area脚手架了,除了在非常高的层次上布置应用程序模块外,请考虑可以作为独立SPA的子应用程序。
我试图使“ catch-all”路由属性成为基础,并将其从中删除RouteConfig.cs
,但是我无法成功完成此操作。问题是路由优先级。它可以很好地用作无效路由的综合。但是对于有效路由,多条(2)路由最终会被匹配,因为两条属性路由具有相同的优先级。而在中定义的包罗万象的情况下RouteConfig.cs
,在注册所有属性路由之后,属性路由优先。我发现了尝试解决此问题的混合答案。似乎在某个时候该属性有一个Number
或Order
参数Route
,但是我对此没有运气。这似乎是一个未解决的问题。只是许多问题之一,这些都没有答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句