ASP.NET Core MVC 从入门到精通之接化发(一)

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。

ASP.NET Core MVC 从入门到精通之接化发(一)

 

经过前一篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及ASP.NET Core MVC的命名约定,创建控制器,视图等内容,今天继续讲解ASP.NET Core MVC 参数接收,传递等相关内容,仅供学习分享使用。

Model模型

在ASP.NET Core MVC项目中,模型是描述用户界面上需要渲染的数据,或是这些数据的一部分。这里要区分实体和模型的概念,Entity-实体,是业务逻辑中使用的数据结构,一般与数据库中对应的表一致;模型是经过转化处理的页面可接收的数据。比如:数据库中的ID等敏感信息,bool类型,日期类型的转换等,均不适宜直接绑定Entity实体到页面,需要转换成模型进行展示。

创建模型

在ASP.NET Core MVC项目中,模型就是一个普通的类。在Models文件夹上,右键点击【添加】【类(C)...】,打开添加类对话框,如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 在添加类对话框,输入名称Student,点击确定,如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 注意:在ASP.NET Core MVC项目中,模型名称没有约定,符合类命名规范即可。除了标识符必须以字母或下划线 (_) 开头。建议命名遵循以下规则:

  • 【规则1-1】使用Pascal规则命名类名,即首字母要大写。
  • 【规则1-2】使用能够反映类功能的名词或名词短语命名类。
  • 【规则1-3】不要使用“I”、“C”、“_”等特定含义前缀。
  • 【规则1-4】自定义异常类应以Exception结尾。
  • 【规则1-5】文件名要能反映类的内容,最好是和类同名。

在模型Student创建成功后,添加相关属性,如下所示:

 1 namespace DemoCoreMVC.Models
 2 {
 3     /// <summary>
 4     /// 学生模型
 5     /// </summary>
 6     public class Student
 7     {
 8         /// <summary>
 9         /// 唯一标识
10         /// </summary>
11         public int Id { get; set; }
12 
13         /// <summary>
14         /// 学生名称
15         /// </summary>
16         public string Name { get; set; }
17 
18         /// <summary>
19         /// 学生年龄
20         /// </summary>
21         public int Age { get; set; }
22 
23         /// <summary>
24         /// 学生性别
25         /// </summary>
26         public string Sex { get; set; }
27     }
28 }

视图绑定模型

首先创建一个空视图模型【也可以创建强类型模型视图】,通过@model  DemoCoreMVC.Models.Student为视图指定模型。然后即可使用模型进行数据绑定,如下所示:

 1 @model  DemoCoreMVC.Models.Student
 2 @{
 3     
 4 }
 5 <h1>欢迎公子小六</h1>
 6 <div>
 7     <span>学号:</span>
 8     <span>@Model.Id</span>
 9 </div>
10 <div>
11     <span>姓名:</span>
12     <span>@Model.Name</span>
13 </div>
14 <div>
15     <span>年龄:</span>
16     <span>@Model.Age</span>
17 </div>
18 <div>
19     <span>性别:</span>
20     <span>@Model.Sex</span>
21 </div>

控制器传递模型

在控制器中 初始化模型数据,然后通过View(model)方法将创建的模型数据传递给视图,如下所示:

 1 using DemoCoreMVC.Models;
 2 using Microsoft.AspNetCore.Mvc;
 3 
 4 namespace DemoCoreMVC.Controllers
 5 {
 6     public class HelloController : Controller
 7     {
 8         public IActionResult Index()
 9         {
10             var student = new Student()
11             {
12                 Id = 1,
13                 Name = "公子小六",
14                 Age = 21,
15                 Sex = ""
16             };
17             
18             return View(student);
19         }
20 
21         public string Welcome()
22         {
23             return "欢迎公子小六...";
24         }
25     }
26 }

运行测试

在Visual Studio 2022中运行程序,在浏览器输入https://localhost:7116/Hello,如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 经过以上步骤,就完成了一个模型数据的流转。

接收URL参数

通过URL传参是HTTP最最常用的办法。这里简单介绍下URL相关的知识。一个URL主要分成4个部分,以https://localhost:7116/Hello/Show?name=公子小六&age=10为例:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

在ASP.NET Core项目中,浏览器端通过URL往服务器端传递参数,可以通过以下几种方式获取:

1. 参数名称自动匹配法

在ASP.NET Core MVC项目中,如果Action的型参的名称跟QueryString的Key一致,则MVC框架会自动帮我们绑定参数的值,不用手动获取。可以根据参数的名称和自动匹配参数值,如下所示:

 1 /// <summary>
 2 /// 自动匹配参数名称
 3 /// </summary>
 4 /// <param name="id"></param>
 5 /// <param name="name"></param>
 6 /// <param name="age"></param>
 7 /// <param name="sex"></param>
 8 /// <returns></returns>
 9 public IActionResult ShowStudent(int id, string name, int age, string sex)
10 {
11     var student = new Student()
12     {
13         Id = id,
14         Name = name,
15         Age = age,
16         Sex = sex
17     };
18     return Json(student);
19 }

在浏览器中,通过请求URL中带参数【https://localhost:7116/Hello/ShowStudent?id=23&name=公子小六&age=25&sex=男】多个参数用&符号隔开。如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 

注意:如果在浏览器中,中文被重新编码成如下格式:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 则可以通过在Porgram.cs中注入MVC服务时修改返回JSON编码的方式来修正,如下所示:

1 // Add services to the container.
2 builder.Services.AddControllersWithViews().AddJsonOptions(options =>
3 {
4     options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
5 });

注意:如果参数绑定的名称跟QueryString的Key不一致,可以使用FromQueryAttribute强制指定绑定的Key的名称。

2. Request.Query获取参数

在Http请求中,可以通过Request.Query["参数名称"]的方式获取参数,如下所示:

 1 /// <summary>
 2 /// 请求参数:Request.Query
 3 /// </summary>
 4 /// <returns></returns>
 5 public IActionResult ShowStudent2()
 6 {
 7     var id = Request.Query["id"];
 8     var name = Request.Query["name"];
 9     var age = Request.Query["age"];
10     var sex = Request.Query["sex"];
11     var student = new Student()
12     {
13         Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
14         Name = name,
15         Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
16         Sex = sex
17     };
18     return Json(student);
19 }

运行程序,在浏览器输入网址【https://localhost:7116/Hello/ShowStudent2?id=23&name=公子小六&age=25&sex=男】

ASP.NET Core MVC 从入门到精通之接化发(一)

 

3. 通过路由获取

在ASP.NET Core MVC项目中,同样可以通过路由匹配的方式获取参数,如下所示:

 1 /// <summary>
 2 /// 通过Route匹配参数
 3 /// </summary>
 4 /// <param name="id"></param>
 5 /// <param name="name"></param>
 6 /// <param name="age"></param>
 7 /// <param name="sex"></param>
 8 /// <returns></returns>
 9 [Route("Hello/ShowStudent3/{id}/{name}/{age}/{sex}")]
10 public IActionResult ShowStudent3(int id, string name, int age, string sex)
11 {
12     var student = new Student()
13     {
14         Id = id,
15         Name = name,
16         Age = age,
17         Sex = sex
18     };
19     return Json(student);
20 }

运行程序,在浏览器中输入【https://localhost:7116/Hello/ShowStudent3/23/公子小六/25/男】,测试效果如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 注意:如果Action的型参名称跟RouteAttribute模板的中的名称不一样,那么可以使用FromRoute强制指定解析的名称。

接收Body参数

我们开发的时候经常通过表单提交数据,或者通过AJAX往后台提交一个JavaScript对象,本质上这些数据都是通过HTTP的Bady提交回去的。在ASP.NET Core MVC项目中,Request.Body是一个Stream对象,通过获取流对象中的内容,然后进行转化,就可以获取参数,如下所示:

 1 [HttpPost]
 2 public IActionResult TestBody()
 3 {
 4     Request.EnableBuffering();
 5     var body = "";
 6     var stream = Request.Body;
 7     if (stream != null)
 8     {
 9         stream.Seek(0, SeekOrigin.Begin);
10         using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
11         {
12             body = reader.ReadToEnd();
13         }
14         stream.Seek(0, SeekOrigin.Begin);
15     }
16 
17     var student = JsonConvert.DeserializeObject<Student>(body);
18     return Json(student);
19 }

通过Body获取,然后JsonConvert进行反序列化,前提是Body内容是JSON格式,否则不能进行反序列化。通过Postman测试如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

 

 以上Body接收参数,主要应用于接口调用,Ajax方式请求等方式。

通过Form表单传递参数

在ASP.NET Core MVC项目中,最常用的是Form表单传递参数,客户端将所有需要传递的内容包括在Form表单内容,在服务器端Action中通过Request.Form["Key"]进行获取。如下所示:

Add.cshtml视图中Form表单内容,如下所示:

 1 <form action="~/Hello/Save" method="post">
 2     <div style="margin:10px;">
 3         <span>学号:</span>
 4         <input type="text" name="Id" />
 5     </div>
 6     <div style="margin:10px;">
 7         <span>姓名:</span>
 8         <input type="text" name="Name" />
 9     </div style="margin:10px;">
10     <div style="margin:10px;">
11         <span>年龄:</span>
12         <input type="text" name="Age" />
13     </div>
14     <div style="margin:10px;">
15         <span>性别:</span>
16         <input type="text" name="Sex" />
17     </div>
18     <div style="margin:10px;">
19         <input type="submit" name="submit" value="保存" />
20     </div>
21 </form>

HelloController中Save方法,如下所示:

 1 [HttpPost]
 2 public IActionResult Save()
 3 {
 4 
 5     var id = Request.Form["Id"];
 6     var name = Request.Form["Name"];
 7     var age = Request.Form["Age"];
 8     var sex = Request.Form["Sex"];
 9     var student = new Student()
10     {
11         Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
12         Name = name,
13         Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
14         Sex = sex
15     };
16     return Json(student);
17 }

运行测试,在浏览器中输入网址【https://localhost:7116/Hello/add】进行测试,如下所示:

ASP.NET Core MVC 从入门到精通之接化发(一)

通过模型接收参数

在更多的时候,为了简便,我们通常采用模型来接收参数,如果模型的属性名和参数的Key一致,则可以自动匹配,非常方便,如下所示:

 1 /// <summary>
 2 /// 通过模型接收参数
 3 /// </summary>
 4 /// <param name="student"></param>
 5 /// <returns></returns>
 6 public IActionResult ShowStudent4(Student student)
 7 {
 8     return Json(student);
 9 }
10 
11 
12 [HttpPost]
13 public IActionResult Save2(Student student)
14 {
15     return Json(student);
16 }

注意:无论是Get方式,还是Post方式,均可以采用Model模型接收参数,效果和上面一致,此处不再演示。

以上就是ASP.NET Core MVC从入门到精通之接化发第一部分内容,进行会进一步讲解接化发第二部分内容。旨在抛砖引玉,温故而知新,一起学习,共同进步。

原文链接:https://www.cnblogs.com/hsiang/p/17297783.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core MVC 从入门到精通之接化发(一) - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • BootStrap实现带有增删改查功能的表格(DEMO详解)

    BootStrap实现带有增删改查功能的表格(DEMO详解) 在Web开发中,表格是一个非常常见的组件。为了提高表格的交互性和用户体验,我们通常会在表格中添加增删改查等功能。本文将介绍如何使用BootStrap实现带有增删改查功能的表格。 环境准备 在使用BootStrap实现带有增删改查功能的表格前,需要先了解以下知识: BootStrap:一个流行的前端…

    C# 2023年5月15日
    00
  • C# SynchronizationContext以及Send和Post使用解读

    C#中的SynchronizationContext是用于处理多线程并发问题的一种机制,它能够确保在多线程环境下的UI操作不会出现问题,保障了程序的稳定性和可靠性。在使用SynchronizationContext时,我们借助它提供的Send和Post方法来将指定的操作添加到指定的队列中,等待处理。 SynchronizationContext的作用 Syn…

    C# 2023年6月6日
    00
  • Visual Studio 未能加载各种Package包的解决方案

    Visual Studio无法加载Package解决方案错误的完整攻略 在使用Visual Studio时,你可能会遇到“未能加载各种Package包”的错误提示。这种情况通常是由于Visual Studio无法找到或加载所需的NuGet Package,而导致的。下面是解决此问题的完整攻略。 步骤一:查看Package控制台 在Visual Studio中…

    C# 2023年5月15日
    00
  • asp.net 错误:0x8007000B 异常的解决方法

    针对”asp.net错误: 0x8007000B”异常的解决方法,我可以提供以下攻略: 1. 了解错误 在解决问题之前,首先需要了解错误的原因和表现。”0x8007000B”错误通常代表着”An attempt was made to load a program with an incorrect format.” 这个错误可能由于多种原因引起,比如操作系…

    C# 2023年5月15日
    00
  • HTTP 2.0 详细介绍

    HTTP 2.0 详细介绍 什么是HTTP/2 HTTP/2是用于安全传输万维网内容的应用层协议。与其前身HTTP/1.1有很多相似之处,但它们有很多重要的不同之处。HTTP/2旨在使Web页面加载更快,同时提供更好的安全性和代码复杂性,而且还带来了一些新功能。 HTTP/2的优点 多路复用HTTP/2采用二进制分帧,一个TCP连接可以传输多个二进制消息(请…

    C# 2023年6月7日
    00
  • C#实现线程安全的简易日志记录方法

    下面我将详细讲解“C#实现线程安全的简易日志记录方法”的完整攻略。 1. 什么是线程安全日志记录方法? 在多线程程序中,多个线程同时进行日志写入时会引发竞争条件,可能导致丢失部分日志或产生不一致的日志。为了解决这个问题,我们需要使用线程安全的日志记录方法,保证每个线程可以正确地写入自己的日志信息,而不会与其他线程产生冲突。 线程安全的日志记录方法可以保证在多…

    C# 2023年6月1日
    00
  • C#中实现在32位、64位系统下自动切换不同的SQLite dll文件

    实现在32位、64位系统下自动切换不同的SQLite dll文件,需要做以下几个步骤: 导入SQLite.Interop.dll文件 在C#项目中使用SQLite时,需要引入SQLite.Interop.dll文件,该文件是SQLite官方提供的用于自动切换32位、64位dll文件的库文件。在VS中创建C#项目后,可以直接从NuGet中搜索SQLite.In…

    C# 2023年6月7日
    00
  • C# Guid长度雪花简单生成器的示例代码

    下面是针对如何编写C# Guid长度的雪花简单生成器的攻略。 1. 为何选择C# Guid C# Guid(全称为全球唯一标识符)是一个128位的数字,由字母和数字构成,它具备全局唯一性,即全球内任意两个Guid的相同概率是非常低的。因此,我们可以利用Guid生成唯一字符串,例如用户ID、订单编号等。 2. 如何生成雪花ID 雪花ID是一种Twitter开源…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部