更改在Razor MVC中创建区域的方式的最佳方法是什么?

杰克

我正在过渡到在项目中使用Areas,每次创建一个新项目时,都必须更改一些内容以使其适合我希望工作的方式。更改涉及:

  • 删除创建的文件夹之一
  • 稍微修改web.config文件
  • 添加一两个带有默认值的新文件
  • 略微修改AreaRegistration文件

我宁愿不必在每次创建新区域时都做同样的事情,因为我担心公约会被遗忘,某些事情会变得混乱。有没有办法修改“新建”>“区域”的默认值?还是有可能制作一个新的文件模板来实现我想要的功能?

埃里克·莱西

我正在过渡到在项目中使用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.csRegisterRoutes()方法,以启用属性路由,然后添加一个包罗万象的路由,例如:

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在注册所有属性路由之后,属性路由优先。我发现了尝试解决此问题的混合答案。似乎在某个时候属性有一个NumberOrder参数Route,但是我对此没有运气。这似乎是一个未解决的问题。只是许多问题之一,这些都没有答案。

编辑以考虑mvc4标签

发布前我没有看到mvc4标签。有可用的nuget软件包可以实现许多相同的功能,例如MVC早期版本的脚手架属性路由

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

更改在 for 循环 Swift 中以编程方式创建的 UIButton 的图像

更改在测验中显示结果的方法

更改在for循环中创建的UIView的属性

更改在pytest中调用固定装置的方式

更改在Breeze的验证器中查找DataProperty displayName的方式

更改在Python 3中打开stdin / stdout的方式

更改在psql中打印数字的方式

设置/更改在Android中更改WebView用户代理

更改在Maven中创建的缩小文件的名称

更改在ViewDidLoad中以编程方式创建的UITextView的字体大小

有没有办法以编程方式更改在 Reality Composer 中创建的实体的材料?

Python Tkinter更改在for循环中创建的单个按钮参数

tkinter:更改在循环中创建的按钮的按钮属性

作为变量更改在R中的列中循环

自动更改在C ++ 11中的含义;请删除它是什么意思?

C ++:从外部更改在lambda中捕获的变量

更改在d3中绘制数据的顺序

更改在Java中单击为红色的像素的颜色?

jQuery的下拉列表更改在codeigniter中不起作用

更改在变量的willSet块中设置的值

如何更改在PowerPoint中插入“设计思路”的元素?

语言更改在Ubuntu 15.04中不起作用

更改在ruby块中调用的代码范围

如何等待样式更改在javascript中

更改在webView中显示的网站,选择了哪个标签

更改在Javascript中作为参数传递的变量

如何更改在“ hexdump”中打印的列数?

枚举更改在企业门户中不可见

更改在UIView draw(_rect)中绘制的路径的颜色