找到多个与名为“user”的控制器匹配的类型 两个Area 解决办法

项目架构:两个Area 一个 Admin,一个User,两个Area里面都有重名的控制器UserControl,结果报错

通过搜索,网站的一致解决办法为,在路由里面用namespaces限定 如下

在区域Member Admin和最外层的RouteConfig.cs限定

public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Member_default",
                "Member/{controller}/{action}/{id}",
                new { Controller = "Home", action = "index", id = UrlParameter.Optional },
                 namespaces: new string[] {"SSHB.Areas.Member.Controllers"}
            );
        }
public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { Controller = "Home", action = "index", id = UrlParameter.Optional },
                namespaces: new string[] {"SSHB.Areas.Admin.Controllers"}
            );
        }
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new string[] { "SSHB.WEB.Controllers" }
            );
        }

结果Admin/User/index、User/User/Index正常,/AAA/这种不存在的控制器返回404也正常,但是当访问到/User/index/的时候仍然出现上述错误,花了2个多小时找问题,最后发现必须要在RouteConfig.cs里添加一个参数才可以DataTokens[“UseNamespaceFallback”] = false

最终结果:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces:new string[] {"SSHB.WEB.Controllers"}
            ).DataTokens["UseNamespaceFallback"] = false; 
        }

至此全部正常,有点坑爹,关于DataTokens[“UseNamespaceFallback”] ,默认为true,设置为false,则只在当前设置的命名空间内匹配规则,而不会去到其他的命名空间里查找匹配。

坑爹的地方在于如果不设置DataTokens[“UseNamespaceFallback”] =false,他会去所有的命名空间下查找User,最终在Area下查找到重名的两个控制器,然后报错,不匹配了还报什么错,直接返回404就完事,日

echarts宽度 100px的问题 % px

在使用echarts的时候发现echarts的宽度变成了100px,明明设置的是100%,一般出现这种情况是在tab切换或者bootstrap的模态框里面,原因是当tab或者modal在隐藏的时候,无法获取到他的宽度值,echarts默认100px的宽度,我用的是bootstrap的modal,解决办法:

第一步、使用modal的shown.bs.modal方法获取弹出框的宽度。

官方文档:当模态框对用户来说可见时(需要等待CSS过渡完成),会触发该事件。如果是由点击引起的,被点击的元素是可用的,成为Event对象的relatedTarget属性。

第二步、使用echarts的resize方法,重新设置大小。

 $('#tree').on('shown.bs.modal', function () {
        myChart.resize({ width: $("#echarts").width(), height: 500 });
    })

echarts的数据模型生成 C# 用户组织架构图

用户上下级关系、层级关系全部循环到一个Model里面去

public class UserController : ApiController
    {
        DAL.EF db = new DAL.EF();
        
        //上级结果只有一个 tree[0],用一个tree[0]存储当前用户以及所有下级的关系
        List<Models.User> tree = new List<Models.User>();

        //用一个V存储所有下级的echarts模型
        V_model V = new V_model();

        public string GetTreeJson(int id)
        {
            var list = db.User_Repository.dbSet.SqlQuery(@"WITH TREE AS(SELECT * FROM [User] WHERE userid = " + id + " UNION ALL SELECT [User].* FROM [User], TREE WHERE [User].ParentID = TREE.userid )SELECT* FROM TREE ").ToList();
            if (list.Count == 0)
            {
                return "";
            }
            //初始值
            var first = list[0];
            V.name = first.TrueName;
            V.value = first.UserNo;
            V.children = new List<V_model>();
            tree.Add(first);

            //开始递归
            AddSub(list,first,V);
            //递归完成
            return JsonConvert.SerializeObject(V) ;//输出echart 数据对象
            //return JsonConvert.SerializeObject(list) ;//输出Models.User对象
        }
        public void AddSub(List<Models.User> all, Models.User curUser,V_model vModel)
        {
            List<Models.User> sublist = all.Where(a => a.ParentID == curUser.UserID).ToList(); //得到子节点
            curUser.SubUsers = sublist;
            foreach (var subItem in sublist)
            {
                var vv = new V_model {
                    name = subItem.TrueName,
                    value = subItem.UserNo,
                    children = new List<V_model>()
                     };
                vModel.children.Add(vv);
                AddSub(all, subItem,vv);
            }
        }
    }
//Echarts数据对象模型
    public class V_model
    {
        public string name { get; set; }
        public string value { get; set; }
        public List<V_model> children { get; set; }
    }
public partial class User
    {
        [Key]
        public int UserID { get; set; }
        ......
        public int ParentID{get;set;}
        [NotMapped]
        public virtual List<Models.User> SubUsers { get; set; }
    }

 

html向后台传参的几个注意事项

 <input type="checkbox" name="b" />
 <input type="checkbox" name="a" value="1"/>
 <input type="checkbox" name="a"  value="2"/>

1、MVC的Action参数如 Add(string a),如果页面选择了复选框,那么此时a的值是1,只能获取第一个值
2、如果没有选择任何复选框,则a的值为null,此时获取需要Add(string[] a)来获取,获取之后需要判断是否为null
3、Request.Form[“a”] 如果选择了复选框,那么此时Request.Form[“a”]值是1或者1,2或者2,如果没选复选框则值是null
4、

<input type="text" value="" name="a"> input type="text" value="" name="a"> 

文本框,不管填没填内容都不会是null,如果全为空,则Request.Form[“a”]和mvc的string [] a 的结果都是 空字符,空字符