zoukankan      html  css  js  c++  java
  • ASP.NET Core MVC中URL和数据模型的匹配

    Http GET方法


    首先我们来看看GET方法的Http请求,URL参数和ASP.NET Core MVC中Controller的Action方法参数匹配情况。

    我定义一个UserController,其中有一个只接受GET请求的Action方法GetDataInPage

    public class UserController : Controller
    {
        [HttpGet]
        public IActionResult GetDataInPage(string languageCode, int currentPage, int pageSize)
        {
            return View();
        }
    }

    GetDataInPage方法有三个参数,那么接下来我们如果在Http请求的URL中不完全提供这三个参数的值,我们来看看会发生什么。

    首先我们用如下URL,只提供currentPage和pageSize参数的值

    http://localhost:9081/User/GetDataInPage?currentPage=5&pageSize=20

    我们会发现,UserController的GetDataInPage方法可以成功执行,其中:

    • languageCode参数为null
    • currentPage参数为5
    • pageSize参数为20

    这说明如果在URL参数中,缺少languageCode参数是没有问题的,UserController的GetDataInPage方法可以被执行。

    接下来如果我们在如下URL中,只提供languageCode和currentPage参数的值

    http://localhost:9081/User/GetDataInPage?languageCode=CN&currentPage=5

    我们会发现,UserController的GetDataInPage方法也可以成功执行,其中:

    • languageCode参数为CN
    • currentPage参数为5
    • pageSize参数为0

    可以看到即便是我们没在URL参数中提供pageSize参数,但是pageSize参数在UserController的GetDataInPage方法也被初始化为0了,并没有妨碍UserController的GetDataInPage方法执行。

    接下来如果我们在如下URL中,什么参数都不提供

    http://localhost:9081/User/GetDataInPage

    我们会发现,UserController的GetDataInPage方法也可以成功执行,其中:

    • languageCode参数为null
    • currentPage参数为0
    • pageSize参数为0

    我们看到这次UserController的GetDataInPage方法还是被执行了,但是其三个参数都没有从URL中获取到值,不得不说ASP.NET Core MVC的模型绑定机制包容性还是很强的,这次我们一个URL参数都没有提供,UserController的GetDataInPage方法还是被执行了。

    接下来如果我们在如下URL中,给参数pageSize提供错误的数据类型

    http://localhost:9081/User/GetDataInPage?languageCode=CN&currentPage=5&pageSize=ABC

    可以看到,UserController的GetDataInPage方法要求pageSize参数是int类型,但是我们却在URL参数中提供的是字符ABC,这种情况下UserController的GetDataInPage方法还是可以被执行,其中:

    • languageCode参数为CN
    • currentPage参数为5
    • pageSize参数为0

    可以看到ASP.NET Core MVC直接忽略掉了URL参数中的pageSize=ABC,将UserController中GetDataInPage方法的pageSize参数设置为了0

    接下来如果我们在如下URL中,提供多余的URL参数message和number

    http://localhost:9081/User/GetDataInPage?languageCode=CN&currentPage=5&pageSize=10&message=ABC&number=100

    我们会发现,UserController的GetDataInPage方法也可以成功执行,其中:

    • languageCode参数为CN
    • currentPage参数为5
    • pageSize参数为10

    可以看到多余的URL参数message和number,不会对UserController的GetDataInPage方法造成影响,GetDataInPage方法还是被成功执行了。

    Http POST方法


    接下来,我们来用POST方法的Http请求,看看和ASP.NET Core MVC中Controller的Action方法参数匹配情况。

    我们将UserController稍作更改,在其内部定义了一个只接受POST请求的Action方法AddUser,注意我们给AddUser方法的UserModel user参数前面加上了[FromBody]标签特性,说明UserModel user参数会从Http请求的Body中获取Json数据来进行模型绑定

    public class UserController : Controller
    {
        [HttpPost]
        public IActionResult AddUser([FromBody]UserModel user)
        {
            return View();
        }
    }

    其中AddUser方法的参数UserModel定义如下

    public class UserModel
    {
        public string UserCode { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public string LanguageCode { get; set; }
        public string MailAddress { get; set; }
        public IList<string> RoleCodes { get; set; }
        public int Status { get; set; }
    }

    然后我们用POST方法的Http请求,发送Json数据到如下URL

    http://localhost:9081/User/AddUser

    其中Json数据只给UserModel类的UserCode、Username和Status属性赋值

    {
      "userCode": "U001",
      "username": "James",
      "status": 1
    }

    我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

    • UserCode参数为U001
    • Username参数为James
    • Password参数为null
    • LanguageCode参数为null
    • MailAddress参数为null
    • RoleCodes参数为null
    • Status参数为1

    可以看到Json数据提供的三个属性UserCode、Username和Status都有值,其余属性都为null

    然后我们用POST方法的Http请求,发送Json数据到如下URL

    http://localhost:9081/User/AddUser

    这一次Json数据什么都不提供,我们发一个空的Json对象到UserController的AddUser方法

    {}

    我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

    • UserCode参数为null
    • Username参数为null
    • Password参数为null
    • LanguageCode参数为null
    • MailAddress参数为null
    • RoleCodes参数为null
    • Status参数为0

    我们发现在Json数据什么都没提供的情况下,UserController的AddUser方法还是被成功执行了,再次说明了ASP.NET Core MVC的模型绑定机制包容性很强

    接下来我们用POST方法的Http请求,发送Json数据到如下URL

    http://localhost:9081/User/AddUser

    这一次Json数据提供错误的数据类型,我们知道UserModel类的Status属性为int类型,我们这次在Json中给Status属性赋值字符串ABC,如下所示

    {
      "userCode": "U001",
      "username": "James",
      "status": "ABC"
    }

    这次UserController的AddUser方法可以被执行,但是我们发现AddUser方法的参数UserModel user整个变为了null:

    应该是由于UserModel类的Status属性匹配Json数据失败导致的

    接下来我们用POST方法的Http请求,发送Json数据到如下URL

    http://localhost:9081/User/AddUser

    这一次我们在Json数据中,提供两个在UserModel类中不存在的属性message和number:

    {
      "userCode": "U001",
      "username": "James",
      "status": 1,
      "message": "ABC",
      "number": 100
    }

    我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

    • UserCode参数为U001
    • Username参数为James
    • Password参数为null
    • LanguageCode参数为null
    • MailAddress参数为null
    • RoleCodes参数为null
    • Status参数为1

    所以Json数据中多余的两个属性message和number不会对UserController的AddUser方法造成什么影响

    接下来我们对UserController的AddUser方法做些修改,在参数UserModel user后,再增加两个参数message和number

    public class UserController : Controller
    {
        [HttpPost]
        public IActionResult AddUser([FromBody]UserModel user, string message, int number)
        {
            return View();
        }
    }

    其中参数message和number从URL参数中获取值

    然后我们用POST方法的Http请求,发送Json数据到如下URL,可以看到URL参数中带有message和number的值

    http://localhost:9081/User/AddUser?message=ABC&number=100

    其中Json数据只给UserModel类的UserCode、Username和Status属性赋值

    {
        "userCode": "U001",
        "username": "James",
        "status": 1
    }

    我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

    • UserCode参数为U001
    • Username参数为James
    • Password参数为null
    • LanguageCode参数为null
    • MailAddress参数为null
    • RoleCodes参数为null
    • Status参数为1

    然后UserController中AddUser方法的message和number参数值如下:

    • message参数为ABC
    • number参数为100

    所以我们可以在UserController的AddUser方法中,既定义从Http请求Body中获取值的参数UserModel user,又定义从Http请求URL中获取值的参数message和number,只要在Http请求中提供了数据,UserController中AddUser方法的所有参数都可以被正确地赋值

  • 相关阅读:
    ACM XXX1
    最大公约数算法
    struct和typedef struct
    PKU 1012
    素数算法3种
    ZOJ 1088
    学习ios开发计划书
    iphone系统架构以及各层提供的主要服务
    iOS 界面元素尺寸
    开发手机版网站有哪些前端框架?
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/10340951.html
Copyright © 2011-2022 走看看