• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
PowerCoder
博客园    首页    新随笔    联系   管理    订阅  订阅

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方法的所有参数都可以被正确地赋值

 

posted @ 2019-01-31 10:47  PowerCoder  阅读(993)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3