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

news2024/10/6 10:41:53

随着技术的发展,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 参数接收,传递等相关内容,仅供学习分享使用。

Model模型

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

创建模型

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

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

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

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

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

namespace DemoCoreMVC.Models
{
    /// <summary>
    /// 学生模型
    /// </summary>
    public class Student
    {
        /// <summary>
        /// 唯一标识
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 学生名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 学生年龄
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 学生性别
        /// </summary>
        public string Sex { get; set; }
    }
}

视图绑定模型

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

@model  DemoCoreMVC.Models.Student
@{

}
<h1>欢迎公子小六</h1>
<div>
    <span>学号:</span>
    <span>@Model.Id</span>
</div>
<div>
    <span>姓名:</span>
    <span>@Model.Name</span>
</div>
<div>
    <span>年龄:</span>
    <span>@Model.Age</span>
</div>
<div>
    <span>性别:</span>
    <span>@Model.Sex</span>
</div>

控制器传递模型

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

using DemoCoreMVC.Models;
using Microsoft.AspNetCore.Mvc;

namespace DemoCoreMVC.Controllers
{
    public class HelloController : Controller
    {
        public IActionResult Index()
        {
            var student = new Student()
            {
                Id = 1,
                Name = "公子小六",
                Age = 21,
                Sex = "男"
            };

            return View(student);
        }

        public string Welcome()
        {
            return "欢迎公子小六...";
        }
    }
}

运行测试

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

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

接收URL参数

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

https://协议
localhost:7116主机地址
/hello/showPATH
name=公子小六&age=10QueryString

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

1. 参数名称自动匹配法

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

/// <summary>
/// 自动匹配参数名称
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <param name="age"></param>
/// <param name="sex"></param>
/// <returns></returns>
public IActionResult ShowStudent(int id, string name, int age, string sex)
{
    var student = new Student()
    {
        Id = id,
        Name = name,
        Age = age,
        Sex = sex
    };
    return Json(student);
}

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

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

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

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

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

2. Request.Query获取参数

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

/// <summary>
/// 请求参数:Request.Query
/// </summary>
/// <returns></returns>
public IActionResult ShowStudent2()
{
    var id = Request.Query["id"];
    var name = Request.Query["name"];
    var age = Request.Query["age"];
    var sex = Request.Query["sex"];
    var student = new Student()
    {
        Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
        Name = name,
        Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
        Sex = sex
    };
    return Json(student);
}

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

3. 通过路由获取

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

/// <summary>
/// 通过Route匹配参数
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <param name="age"></param>
/// <param name="sex"></param>
/// <returns></returns>
[Route("Hello/ShowStudent3/{id}/{name}/{age}/{sex}")]
public IActionResult ShowStudent3(int id, string name, int age, string sex)
{
    var student = new Student()
    {
        Id = id,
        Name = name,
        Age = age,
        Sex = sex
    };
    return Json(student);
}

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

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

接收Body参数

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

[HttpPost]
public IActionResult TestBody()
{
    Request.EnableBuffering();
    var body = "";
    var stream = Request.Body;
    if (stream != null)
    {
        stream.Seek(0, SeekOrigin.Begin);
        using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
        {
            body = reader.ReadToEnd();
        }
        stream.Seek(0, SeekOrigin.Begin);
    }

    var student = JsonConvert.DeserializeObject<Student>(body);
    return Json(student);
}

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

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

通过Form表单传递参数

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

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

<form action="~/Hello/Save" method="post">
    <div style="margin:10px;">
        <span>学号:</span>
        <input type="text" name="Id" />
    </div>
    <div style="margin:10px;">
        <span>姓名:</span>
        <input type="text" name="Name" />
    </div style="margin:10px;">
    <div style="margin:10px;">
        <span>年龄:</span>
        <input type="text" name="Age" />
    </div>
    <div style="margin:10px;">
        <span>性别:</span>
        <input type="text" name="Sex" />
    </div>
    <div style="margin:10px;">
        <input type="submit" name="submit" value="保存" />
    </div>
</form>

HelloController中Save方法,如下所示:

[HttpPost]
public IActionResult Save()
{

    var id = Request.Form["Id"];
    var name = Request.Form["Name"];
    var age = Request.Form["Age"];
    var sex = Request.Form["Sex"];
    var student = new Student()
    {
        Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
        Name = name,
        Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
        Sex = sex
    };
    return Json(student);
}

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

通过模型接收参数

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

/// <summary>
/// 通过模型接收参数
/// </summary>
/// <param name="student"></param>
/// <returns></returns>
public IActionResult ShowStudent4(Student student)
{
    return Json(student);
}


[HttpPost]
public IActionResult Save2(Student student)
{
    return Json(student);
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PathCore:IAD文献解读

论文链接&#xff1a;[Towards Total Recall in Industrial Anomaly Detection]Towards Total Recall in Industrial Anomaly Detection &#xff1a;数据集&#xff0c; &#xff1a;标签 : 在ImageNet上预训练后的网络 第 张图 网络中第 层 1. Locall…

Sentinel学习笔记

Sentinel 官方文档&#xff1a; https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 SpringCloud Alibaba&#xff1a; https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel 是什么…

丝滑的打包部署,一套带走~

以下文章来源于悟空聊架构 &#xff0c;作者悟空聊架构 本文主要内容如下&#xff1a; 目录 一、背景 Docker打包部署方案 项目背景&#xff1a;新项目的后端框架是刚起步&#xff0c;搭建的是一套微服务框架&#xff0c;基础服务有网关 Gateway&#xff0c; Nacos 注册中心…

为什么stm32gpio引脚的翻转速度最大只有18Mhz

(1). GPIO 引脚速度&#xff1a;GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度&#xff1a;&#xff08;芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路&#xff0c;用户可以根据自己的需要选择合适的驱动电路&#xff0c;通过选择速度来选择…

史上最全测试开发工具视频教程详解(含自动化、性能、接口、抓包)

目录 一、UI自动化测试工具 1. uiautomator2 2. Appium 3. ATX-Test 4. Airtest 5. ATXServer2 6. STF 7. Appetizer 二、APP稳定性测试工具 8. UICrawler 9. Maxim 10. AppCrawler 三、APP性能测试工具 11. SoloPi 12. GT 四、抓包工具 13. AnyProxy …

pytorch安装教程(二)

一直用的pytorch1.2&#xff0c;有点老了&#xff0c;想换个新版本&#xff0c;换成了pytorch2.0. torch安装 安装过程最重要的就是cuda、cudnn的版本和pytorch对应。 因为要在GPU上跑代码。 删除老旧torch 我用的软件是anaconda&#xff0c;因为可以创建虚拟环境。 步骤&…

LAZADA将缩短履约时效,卖家发货倍感压力

Lazada的跨境卖家们&#xff0c;恐怕又要头疼了。 近日&#xff0c; Lazada官方宣布&#xff0c;为了提升消费者体验&#xff0c;平台将调整商家履约订单时效。从2023年5月4日起生成的订单履约时效将有所更新。 具体而言&#xff0c;内地、香港和Laz Go Global的履约节点为“点…

Qt Quick - MessageDialog 消息提示框

MessageDialog 使用总结一、概述二、使用1. 例子一2. 例子二三、常用属性一、概述 MessageDialog 最基本的用例是弹出警告框。它还允许用户根据启用的按钮以各种方式进行响应。对话框最初是不可见的。你需要首先按需设置属性&#xff0c;然后将visible设置为true或调用open()。…

FIFO设计笔记(双口RAM、同步FIFO、异步FIFO)Verilog及仿真

文章目录0、前言0.1、FIFO0.2、FIFO与RAM1、异步双口RAM1.1、原理1.2、Verilog代码1.3、tb仿真2、FIFO设计前瞻知识2.1、格雷码2.1.1、二进制转格雷码Verilog代码tb仿真2.1.2、格雷码转二进制Verilog代码tb仿真2.2、独热码3、同步FIFO3.1、同步FIFO设计原理3.1.1、设计原理3.1.…

SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法

场景 SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list&#xff1a; SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_霸道流氓气质的博客-CSDN博客 在上面讲操作redis中特…

【未来已来】人人都说GPT,人人都怕GPT,人人都用GPT

文章目录前言一、GPT是什么&#xff1f;二、当GPT和AI遇到摄影总结前言 ChatGPT是由美国OpenAI研发的能够通过自然语言驱动的人工智能技术工具&#xff0c;因为它强大的执行力和任务处理能力&#xff0c;一经亮相就引起了极大的关注。与之类似&#xff0c;在图像智能生成方面&…

Java 自学 - 接口与继承 接口

设计 Java 的接口 在设计 LOL 的时候&#xff0c;进攻类英雄有两种&#xff0c;一种是进行物理系攻击&#xff0c;一种是进行魔法系攻击 这时候&#xff0c;就可以使用接口来实现这个效果。 接口就像是一种约定&#xff0c;我们约定某些英雄是物理系英雄&#xff0c;那么他们…

交接机的基本原理

第七章&#xff1a;交接机的基本原理 在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备&#xff0c;了解以太网交换机的工作…

抽象轻松web

不管是求最大值&#xff0c;还是最小值&#xff0c;无论是整数还是小数&#xff0c;数据类型是不是一样的 它们的本质上都是判断&#xff0c;在判断的基础上不断的变换&#xff0c;增加判断条件&#xff0c;增加判断过程罢了 判断需要两个本质 1 &#xff1a;两个以上的元素…

Redis高可用高性能缓存的应用系列2 - 事务机制和IO多路复用、持久化

概述 Redis高可用高性能缓存的应用系列的第二篇&#xff0c;主要介绍Redis事务机制和IO多路复用、和持久化的知识点。 Redis事务机制 Redis事务机制&#xff0c;和Mysql有大的不同&#xff0c;分为4步进行执行&#xff1a; 1.事务提交前&#xff0c;先检查命令语法是否正确…

【2023版】基于部标JT808JT1078车载视频位置监控平台介绍-开源项目

演示地址&#xff1a;http://gps.lingx.com 账号&#xff1a;admin 密码&#xff1a;123456 部标/苏标设备入口 IP&#xff1a;47.100.112.218 &#xff1b; 端口&#xff1a;8808 1.项目背景 “GPS/GPRS车辆智能管理系统”具备车辆实时定位监控、远程监控调度、行驶路线偏移…

ChatGPT帮我和老板吵架,半分钟做了个思维导图...

大家好&#xff0c;我是小z&#xff0c;也可以叫我阿粥最近那个疑似成都电科的截图已经传疯了&#xff0c;贴一张图回味下&#xff1a;这种壮士断腕式的吵法&#xff0c;可以说几乎是单方面的虐杀。但是有朋友问了&#xff0c;在职场中还是有所顾忌&#xff0c;有没有更体面点的…

什么是浪涌保护器防雷过压保护

每年有数十万起雷击和过电压造成的损坏&#xff0c;造成的损失高达数千万元。过压保护装置是电气装置综合保护概念的一部分&#xff0c;可以可靠地防止过压造成的损坏。 过电压损坏 过电压是小于千分之一秒的短暂电压峰值&#xff0c;超过电气设备允许的设计工作电压的许多倍…

因为我没交周报,leader要罚款200元,怎么给他挖坑?能以敲诈勒索罪告他吗?...

没交周报就罚款&#xff0c;这种事你们遇到过吗&#xff1f;一位网友说&#xff1a;leader在群里通知不交周报就罚款&#xff0c;这周罚到他头上&#xff0c;要罚款200元&#xff0c;这种情况怎么办&#xff1f;能定他一个敲诈勒索罪或者抢劫罪吗&#xff1f;最差也要在离职后把…

paddle通过极简方案构建手写数字识别模型

参考&#xff1a; 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 前提条件 在数据处理前&#xff0c;首先要加载飞桨平台与“手写数字识别”模型相关的类库&#xff0c;实现方法如下。 #加载飞桨和相关类库 import paddle from paddle.nn import Linear import paddle.nn…