Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';在Razor MVC中更改区域创建方式的最佳方法是什么?_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

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文件
我不希望每次创建一个新的区域时都要做同样的事情,因为我担心会议会被遗忘,有些事情会搞砸。有没有办法修改New>Area的默认设置?或者,是否有可能制作一个新的文件模板来满足我的需要

我正在过渡到在项目中使用区域

我已经做了几个月类似的事情,但从一个旧的WebForms项目开始,通过VS2013的
Add->New Scaffolded Item…
功能添加MVC组件,以便在服务器端利用MVC的结构和路由。我还在服务器端合并了WebAPI和Signal。我肯定还是一个初学者,但在类似的过程中可能会走得更远一些,下面是我对您想要实现的目标的一些想法和问题:


  • 正在删除已创建的文件夹之一
  • 稍微修改web.config文件
  • 添加一个或两个带有一些默认值的新文件
你在什么环境中发展?例如,如果您正在使用VS 2013的脚手架,您很可能会修改T4模板,以防止或重定向文件夹、类等的创建。这是一篇文章,你可以在这里找到这些模板,这只是T4的众多介绍之一。计算机上模板的路径将根据VS版本而有所不同。通过修改或创建新模板,您应该能够相对容易地完成以上所有3点。如果您在这样的环境中工作,我将尝试详细阐述您可能如何修改开箱即用的模板(可能已经有很多帖子可以参考,但它们会做得更好)


  • 稍微修改AreaRegistration文件
如果您使用的是MVC5或更高版本,我建议您使用属性路由。在API范例中工作时,这似乎更标准(从
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,我们不使用它,因此忘记删除该行将破坏构建。这是一个非常详细的答案!我一定会尽快完成!