C# 什么';在Razor MVC中更改区域创建方式的最佳方法是什么?
我正在过渡到在项目中使用区域,每次我创建一个新的区域时,我都必须更改一些内容,使其与我希望的工作方式相适应。这些变化涉及:C# 什么';在Razor MVC中更改区域创建方式的最佳方法是什么?,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在过渡到在项目中使用区域,每次我创建一个新的区域时,我都必须更改一些内容,使其与我希望的工作方式相适应。这些变化涉及: 正在删除已创建的文件夹之一 稍微修改web.config文件 添加一个或两个带有一些默认值的新文件 稍微修改AreaRegistration文件 我不希望每次创建一个新的区域时都要做同样的事情,因为我担心会议会被遗忘,有些事情会搞砸。有没有办法修改New>Area的默认设置?或者,是否有可能制作一个新的文件模板来满足我的需要 我正在过渡到在项目中使用区域 我已经做了几个
- 正在删除已创建的文件夹之一
- 稍微修改web.config文件
- 添加一个或两个带有一些默认值的新文件
- 稍微修改AreaRegistration文件
Add->New Scaffolded Item…
功能添加MVC组件,以便在服务器端利用MVC的结构和路由。我还在服务器端合并了WebAPI和Signal。我肯定还是一个初学者,但在类似的过程中可能会走得更远一些,下面是我对您想要实现的目标的一些想法和问题:
- 正在删除已创建的文件夹之一
- 稍微修改web.config文件
- 添加一个或两个带有一些默认值的新文件
- 稍微修改AreaRegistration文件
ApiController
继承而不是Controller
),但我发现将其扩展到传统MVC控制器非常有用
假设使用MVC 5,我建议修改AppStart\RouteConfig.cs
的registerOutes()
方法,以启用属性路由,然后添加一个全包路由,例如:
routes.MapMvcAttributeRoutes();
routes.MapRoute(
"NotFound",
"{*url}",
new {
controller = "Error",
action = "Index"
});
此时,我将删除xAreaRegistration.cs文件,并从Global.asax
中删除对registeralareas()
的调用,但您不必走那么远。然后,我根据需要用属性装饰控制器的类(无论它们位于何处)及其方法。使用属性路由,我已经能够从传统的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) {
...
}
}
这种查看区域的方式更符合逻辑,因为mycontrollernamedesnotmatter.cs
文件不必位于Area\ar\Controllers
文件夹中。自从采用了它,我实际上已经不再使用区域脚手架,而是在一个非常高的层次上布置应用程序模块——想想子应用程序,它可能是一个独立的SPA
我已尝试使“catch all”路由属性基于,并将其从RouteConfig.cs
中删除,但未能成功完成此操作。问题是路线优先。它可以作为无效路由的全面解决方案。但对于有效路由,多(2)个路由最终会匹配,因为两个属性路由具有相同的优先顺序。然而,如果在RouteConfig.cs
中定义了catch all,则在注册所有属性路由后,属性路由优先。我找到了各种各样的答案,试图解决这个问题。在某个点上,Route
属性似乎有一个Number
或Order
参数,但我没有运气。这似乎是一个尚未解决的问题,这些问题没有得到回答
编辑以说明mvc4标记
在发布之前,我没有看到mvc4标签。有一些nuget软件包可以实现很多相同的功能,例如和早期版本的MVC。为什么要做前两个更改?第一个更改只是因为我们更愿意遵循一个约定(控制器位于Controllers文件夹之外,但这没什么大不了的,如果不更改也不介意)。需要修改web.config,因为默认的修改包括System.web.Optimization,我们不使用它,因此忘记删除该行将破坏构建。这是一个非常详细的答案!我一定会尽快完成!