Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core 嵌套要素文件夹层次结构中按操作名称的方法_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

Asp.net core 嵌套要素文件夹层次结构中按操作名称的方法

Asp.net core 嵌套要素文件夹层次结构中按操作名称的方法,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我在这里了解了功能文件夹的实现: 我真的很喜欢按功能而不是文件类型进行分离的想法。我正在开发一个增强的解决方案,它允许在无限级别上构建功能的层次结构 我为此创建了一个非常简单的文件夹/文件组织逻辑。例如: [Feature] [Auth] [Entity] User.cs Role.cs [Route] [Login] [Forgot] Forgot.cs Forgot.c

我在这里了解了功能文件夹的实现:

我真的很喜欢按功能而不是文件类型进行分离的想法。我正在开发一个增强的解决方案,它允许在无限级别上构建功能的层次结构

我为此创建了一个非常简单的文件夹/文件组织逻辑。例如:

[Feature]
  [Auth]
    [Entity]
      User.cs
      Role.cs
    [Route]
      [Login]
         [Forgot]
            Forgot.cs
            Forgot.cshtml
            ForgotModel.cs
         Login.cs
         Login.cshtml
         LoginModel.cs
      Index.cs
      Index.cshtml
    Auth.cs
public class Login : Controller
{
   public IAcionResult Get()
   {
      return View();
   }

   public IAcionResult Post(LoginModel model)
   {
      return Ok()
   }
}
正如您可以看到的,所有内容都放置在顶级要素文件夹下。在此文件夹中有特定的要素文件夹(Auth)。在该文件夹下有一个Route子文件夹,其中包含所有控制器/视图的层次结构

对于上面的示例,我已经实现了一个自定义路由逻辑,它为我提供了以下路由:

/Auth
/Auth/Login
/Auth/Login/Forgot
这是可行的,但我不知道我是做得好还是完全错了。要实现自定义路由,我只需执行以下操作:

public void Apply(ControllerModel controller)
{
   //From the article I linked before:
   controller.Properties.Add("feature", 
     GetFeatureName(controller.ControllerType));

   //My custom route value implementation:
   controller.Selectors.Clear();

   var routePath = GetRoutePath(controller.ControllerType); //"auth/login/forgot"
   var routeAttr = new RouteAttribute(routePath);
   var selector = new SelectorModel 
     { 
       AttributeRouteModel = new AttributeRouteModel(routeAttr) 
     };

   controller.Selectors.Add(selector);

}
  • controller.Selectors是应用自定义路由路径的好地方吗
  • 是否真的需要在添加新文件之前清除.Clear()
我没有找到任何关于controller.Selectors的文章

我还喜欢实现一个对操作名到http方法转换的支持,其中所有标准http谓词操作名(get、post、put、patch、delete)都自动绑定到相应的http方法过滤器。例如:

[Feature]
  [Auth]
    [Entity]
      User.cs
      Role.cs
    [Route]
      [Login]
         [Forgot]
            Forgot.cs
            Forgot.cshtml
            ForgotModel.cs
         Login.cs
         Login.cshtml
         LoginModel.cs
      Index.cs
      Index.cshtml
    Auth.cs
public class Login : Controller
{
   public IAcionResult Get()
   {
      return View();
   }

   public IAcionResult Post(LoginModel model)
   {
      return Ok()
   }
}

我不想在只有get/post操作的地方使用[HttpGet]和[HttpPost]属性。我认为有一个官方的解决方案,但我找不到

我找到了一个看起来效果不错的解决方案。但我真的不确定我刚才用这个做了什么:

    public class ActionModelConvention : IActionModelConvention
    {
        private static readonly List<String> httpVerbs;

        static ActionModelConvention()
        {
            httpVerbs = new List<String> { "GET", "POST", "PUT", "PATCH", "DELETE" };
        }

        private readonly ActionParserOptions options;

        public ActionModelConvention(ActionParserOptions options)
        {
            this.options = options;
        }

        public void Apply(ActionModel action)
        {
            var upper = action.ActionName.ToUpper();
            var found = httpVerbs.FirstOrDefault(
                     e => upper.Length >= e.Length &&
                     e == upper.Substring(0, e.Length));

            if (found != null)
            {
                //action.Selectors.Clear(); //no need to clear...I think...

                var constraint = new Microsoft.AspNetCore.Mvc.Internal //> Internal!
                    .HttpMethodActionConstraint(new String[] { found });

                var selector = new SelectorModel();
                    selector.ActionConstraints.Add(constraint);

                action.Selectors.Add(selector);
            }
        }
公共类ActionModelConvention:IActionModelConvention
{
私有静态只读列表httpVerbs;
静态ActionModelConvention()
{
httpVerbs=新列表{“获取”、“发布”、“放置”、“修补”、“删除”};
}
私有只读ActionParserOptions选项;
公共ActionModelConvention(ActionParserOptions选项)
{
this.options=选项;
}
公共无效应用(ActionModel action)
{
var upper=action.ActionName.ToUpper();
var found=httpVerbs.FirstOrDefault(
e=>上部长度>=e.长度&&
e==上部子串(0,e.Length));
如果(找到!=null)
{
//action.Selectors.Clear();//不需要清除……我想。。。
var constraint=new Microsoft.AspNetCore.Mvc.Internal//>Internal!
.HttpMethodActionConstraint(新字符串[]{found});
变量选择器=新选择器模型();
选择器.ActionConstraints.Add(约束);
action.selector.Add(选择器);
}
}
我认为使用Microsoft.AspNetCore.Mvc.Internal命名空间中的任何内容都不是一个好主意。但我还没有找到其他方法

有什么想法吗