Asp.Net Core Web API 参数

//多参数传递
[HttpPost]
public IActionResult Post(string a,string b)
{}
//ajax不可设置为contentType: "application/json;",不设置
//ajax data直接传入JSON对象data:{ "a": "1", "b": "2" }或者data:"a=1&b=2"
//传递参数名和接受的参数名必须一致
如果public IActionResult Post(string a),那么传值data: { "": "Jim" },a的值就是jim
前端传入data: {a:["11","22","33"]},后端接收public IActionResult Sort(string[] a)
//JSON对象传递,只能传递一个参数, js如下设置
//ajax contentType: "application/json;", 设置之后变成了Request Payload
//ajax JSON.stringify(data),需要转化为JSON字符串
//后台只接收一个参数,类型为dynamic、object、model
//后台必须使用[FromBody]
[HttpPost]
public IActionResult Post([FromBody]dynamic d)
public IActionResult Post([FromBody]object d)
public IActionResult Post([FromBody]model d)

asp.net core mvc ActionFilter 不继续执行下面的代码

在mvc的过滤器里面,执行相关的控制器之前,会先执行ActionFilter里面的代码,比如登陆时候,在执行admin/list的时候 先执行actionfilter里的代码,若果需要跳转,可以写成

context.HttpContext.Response.Redirect("/admin/login")

但是这样的问题,在于此时跳转后,会继续执行admin/list的代码,这是我们不希望的,改成

context.Result = new Microsoft.AspNetCore.Mvc.RedirectResult("/admin/login/");

这样程序将直接跳转,不会执行下面的请求

asp.net mvc 获取同name input情况

<input name="a" value="1"/>
<input name="a" value="2"/>
<input name="a" value="3"/>
<input name="a" value="b"/>最后一个为字符

 获取方式:

1、Request.From[“a”] 结果为字符串”1,2,3,b”

2、使用参数获取,如:add(string a),结果为1

3、使用数组参数获取,如add(string [] a),结果为数组1,2,3,4,使用add(int[] a )结果为int数组1,2,3   b被忽略掉

AutoMapper 转换时处理字段 asp.net core

public class AutoMapperConfig : Profile
    {
        public AutoMapperConfig()
        {
            CreateMap<Models.Goods, Models.V_Goods>().ForMember(
                x => x.AddTime,
                opt => opt.MapFrom(src => ((DateTime)src.AddTime).ToString("yyyy-MM-dd HH:mm:ss")));
        }
    }

Models.Goods转化为Models.V_Goods时,将Goods.AddTime转换为格式化后的字符串

asp.net core 接收 payload application/json 参数

asp.net core 接收 payload application/json 参数,payload有点特殊,不像普通的get或者post那样key、value对应,而application/json只是给服务器返回一个json数据,所以不能类似a=1&b=2,用string a,string b接收,两种办法处理这个问题
1、用模型
比如json,他本身是一个数组,那么像对应的用List可以接收如下内容:

[
    {
        "ContentId": 4,
        "ContentCategoryId": 0,
        "Title": "他在网吧苦练多年 最终代表中国赢下WCG世界冠军1",
        "Sort": 100,
        "AddTime": "2018-11-21T14:57:58.64062",
        "UpdateTime": "2018-11-21T02:56:38",
        "Hits": 0,
        "ContentCategory": null
    },
    {
        "ContentId": 13,
        "ContentCategoryId": 0,
        "Title": "他在网吧苦练多年 最终代表中国赢下WCG世界冠军2",
        "Sort": 100,
        "AddTime": "2018-11-21T14:57:58.64062",
        "UpdateTime": "2018-11-21T02:56:38",
        "Hits": 0,
        "ContentCategory": null
    }]
public string Sort([FromBody]List<Models.V_Content> list)
        {
            return "";
        }

2、用object 或者dynamic
我在开发中遇到必须要传一个对象,而不能是数组,比如vue的axios,

axios.post('/admin/Content/sort',
                    {"list":this.list},
                )

json:

{
    "list": [
        {
            "ContentId": 4,
            "ContentCategoryId": 0,
            "Title": "他在网吧苦练多年 最终代表中国赢下WCG世界冠军1",
            "Sort": 100,
            "AddTime": "2018-11-21T14:57:58.64062",
            "UpdateTime": "2018-11-21T02:56:38",
            "Hits": 0,
            "ContentCategory": null
        },
        {
            "ContentId": 13,
            "ContentCategoryId": 0,
            "Title": "他在网吧苦练多年 最终代表中国赢下WCG世界冠军2",
            "Sort": 100,
            "AddTime": "2018-11-21T14:57:58.64062",
            "UpdateTime": "2018-11-21T02:56:38",
            "Hits": 0,
            "ContentCategory": null
        }]
}

那么此时就用用object 或者dynamic

[HttpPost]
        public string Sort([FromBody]object json)
        {
            JObject jObject = JObject.Parse(json.ToString());
            var  data = jObject.SelectToken("list").ToString();
            var list = JsonConvert.DeserializeObject<List<Models.V_Content>>(data);
            .....
            return "";
        }

加载了名为“Microsoft.VisualStudio.Web.PageInspector.Tracing”的程序集。使用此上下文会导致序列化、强制转换和依赖项解析出现意外的行为

vs报错如下:

托管调试助手 “LoadFromContext”:“使用 LoadFrom 上下文从“file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/Common7/IDE/Extensions/Microsoft/Web Tools/Page Inspector/Microsoft.VisualStudio.Web.PageInspector.Tracing.DLL”加载了名为“Microsoft.VisualStudio.Web.PageInspector.Tracing”的程序集。使用此上下文会导致序列化、强制转换和依赖项解析出现意外的行为。建议用户在任何情况下都避免使用 LoadFrom 上下文。这可以通过在全局程序集缓存或在 ApplicationBase 目录中安装程序集,并在显式加载程序集时使用 Assembly.Load 来实现。”

解决方法:

打开C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config、web.config),将这个内容的“add”改为“remove”:

<compilation>
<assemblies>
<remove assembly=”Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />

找到多个与名为“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就完事,日