什么是改变Razor MVC中Area的创建方式的最佳方法?

时间:2015-04-02 18:03:39

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

我正在转换到在项目中使用区域,每次我创建一个新区域时,我都需要更改一些内容以使其适合我喜欢的工作方式。这些变化涉及:

  • 删除其中一个已创建的文件夹
  • 稍微修改web.config文件
  • 添加一个或两个具有默认值的新文件
  • 稍微修改AreaRegistration文件

每次我创建一个新区域时,我宁愿不必做同样的事情,因为我担心会议会被遗忘而且有些事情会搞砸。有没有办法修改New>的默认值?区域?或者也许可以创建一个新的文件模板来做我想做的事情?

1 个答案:

答案 0 :(得分:3)

  

我正在转换为使用项目中的区域

我几个月来一直在做类似的事情,但是从一个旧的WebForms项目开始,通过VS 2013的Add -> New Scaffolded Item...功能添加MVC组件,以便利用MVC的结构和路由,在服务器端。我也在服务器端整合了WebAPI和SignalR。我绝对是一个初学者,但在类似的过程中可能会更进一步,这里有一些关于你想要实现的想法和问题:


  
      
  • 删除其中一个已创建的文件夹
  •   
  • 稍微修改web.config文件
  •   
  • 添加一个或两个具有默认值的新文件
  •   

你在开发什么环境?例如,如果您使用VS 2013的脚手架,则很可能会修改T4模板以防止或重定向文件夹,类等的创建。 Here是一个帖子寻址,您可以在其中找到这些模板,here只是T4的众多介绍之一。计算机上模板的路径因VS版本而异。通过修改或创建新模板,您应该能够相对容易地完成所有3点以上。如果您在这样的环境中工作,我将尝试详细说明您可能会如何修改开箱即用的模板(可能已经有很多帖子可以参考,哪些会做得更好)。 / p>


  
      
  • 稍微修改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()删除对Global.asax的通话,但您不必走那么远。然后我装饰我的控制器'类(他们居住的地方)和他们的方法,根据需要使用属性。使用属性路由,我已经能够摆脱传统的MVC约定。我仍然可以回到他们身边,但我可以将我的控制器放在我的项目的任何地方,并轻松定义他们的行动'路线。

话虽这么说,你应该对类似路线的群体遵循一些组织标准,这样随着项目的发展,你不会发现自己浪费了大量的时间来搜索匹配某些路线的所有控制器/动作。


这是一个简单的例子,说明它实际上如何从URI转换为方法调用:

如果我的控制器ctl包含操作act逻辑上位于区域ar,则URI为http://localhost/ar/ctl/a/1,将路由到{ {1}},在下面,使用属性修饰,例如:

MyControllerNameDoesNotMatter.Index(1)

这种查看Area的方式比物理更合乎逻辑,因为[RouteArea("ar")] [RoutePrefix("ctl")] public class MyControllerNameDoesNotMatter : Controller { ... [Route("a/{optionalParamDefaultsToNegativeOne=-1}")] public ActionResult Index(int optionalParamDefaultsToNegativeOne) { ... } } 文件不必位于MyControllerNameDoesNotMatter.cs文件夹中。自从采用这个以来,我实际上已经远离使用区域脚手架,除了在非常高的层次上布置应用程序模块 - 想想可能是独立SPA的子应用程序。

我试图让#34; catch-all"基于路由属性,并将其从Area\ar\Controllers中删除,但我无法成功完成此操作。问题是路线优先。它可以很好地作为无效路由的全能。但是对于有效路由,多个(2)路由最终匹配,因为两个属性路由具有相同的优先顺序。然而,在注册所有属性路由之后,使用RouteConfig.cs中定义的catch-all,属性路由优先。我找到了试图解决这个问题的混合答案。在某些时候,RouteConfig.cs属性似乎有NumberOrder参数,但我没有运气。这似乎是一个尚未解决的问题。 Just one of many SO questions,但没有得到答复。

编辑为mvc4标签

我没有在发布之前看过mvc4标签。有一些nuget包可以实现大部分相同的功能,例如scaffoldingattribute routing用于早期版本的MVC。