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

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从入门到精通之接化发第一部分内容,进行会进一步讲解接化发第二部分内容。旨在抛砖引玉,温故而知新,一起学习,共同进步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Photoshop 2023 的系统最低要求+安装图文教程

Adobe Photoshop 2023(PS2023) 来了,全世界数以百万计的设计师、摄影师和艺术家使用 Photoshop 将不可能变为可能。 从海报到包装&#xff0c;从基本的横幅到漂亮的网站&#xff0c;从令人难忘的徽标到引人注目的图标&#xff0c;Photoshop 让创意世界不断前进。 ​借助直观的…

UI Toolkit(1)

UI ToolkitUI Toolkit界面画布设置背景制作UI布局UI Toolkit界面 在Unity 2021LTS版本之后UI Toolkit也被内置在Unity中&#xff0c;Unity有意的想让UI Toolkit 成为UI的主要搭建方式&#xff0c;当然与UGUI相比还是有一定的差别。他们各有有点&#xff0c;这次我们就开始介绍…

从功能到年薪30W+的测试开发工程师,分享我这10年的职业规划路线

求职&#xff1f;择业&#xff1f;跳槽&#xff1f;职业规划&#xff1f; 作为一名初出茅庐的软件测试员&#xff0c;职业发展的道路的确蜿蜒曲折&#xff0c;面对一次次的岗位竞争&#xff0c;挑战一道道的面试关卡&#xff0c;一边带着疑惑&#xff0c;一边又要做出选择&…

Python 进阶指南(编程轻松进阶):十二、使用 Git 组织您的代码项目

原文&#xff1a;http://inventwithpython.com/beyond/chapter12.html 版本控制系统是记录所有源代码变更的工具&#xff0c;使检索旧版本代码变得容易。把这些工具想象成复杂的撤销功能。例如&#xff0c;如果您替换了一个函数&#xff0c;但后来发现您更喜欢旧的函数&#xf…

安卓手机什么便签好

手机便签作为一种方便、实用、安全的记录工具&#xff0c;可以帮助我们更好地记录和管理各类生活、工作、学习事务&#xff0c;从而提高我们的办事效率和质量&#xff0c;例如大家可以把工作中的注意事项、待办事项、常用的账号密码、有关孩子的重要信息都记录到便签中保存。 而…

ERP:华为杀入,金蝶们打颤?

配图来自Canva可画 近期&#xff0c;华为官方透露将在4月份推出自研MetaERP管理系统&#xff0c;引来不少媒体和业内人士的围观&#xff0c;紧接着关于华为“进军ERP市场”的解读更是不胫而走&#xff0c;所谓一石激起千层浪&#xff0c;此说法一出&#xff0c;直接导致了金蝶…

【嘉立创EDA】局部阵列对齐及强制对齐方法

文章路标👉 文章解决问题主题内容文章解决问题 1️⃣ 嘉立创EDA中对齐工具越发完善,但一些场合中定制对齐,还需要手动进行对齐,特别是阵列式的电路局部。本文主要讲述如何应用嘉立创EDA的其他技巧将器件进行强制对齐。本文将此过程记录,以供有需要的读者参考。 主题内…

RocketMQ-01

1. MQ介绍 1.1 为什么要用MQ 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高&#xff0c;容错性就越低。以电商应用为例&#xff0c;用户创建订单后&#xff0c;如果耦合调用库存系统、物流系统、支付系统&#xff0c;任…

SAP Move to Rise是什么意思? SAP Move的五条路径是什么?

在数字经济时代&#xff0c;每一个企业都需要进行数字化转型&#xff0c;转型成为这个世界重复率最高的词汇之一。2021年SAP发布重磅战略“RISE with SAP”&#xff0c;这意味着SAP不仅仅为客户提供商业套件的产品、技术、而且包括了业务流程的转型设计。用SAP CEO 柯睿安 (Chr…

【PTA 题解】L1-083 谁能进图书馆(标志位)(C+Python)

题目 为了保障安静的阅读环境&#xff0c;有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆&#xff0c;除非有 18 岁以上&#xff08;包括 18 岁&#xff09;的成人陪同”。现在有两位小/大朋友跑来问你&#xff0c;他们能不能进去&#xff1f;请你写个程序…

穿戴规范智能识别系统 yolov7

穿戴规范智能识别系统通过yolov7python网络模型AI深度视觉学习算法&#xff0c;穿戴规范智能识别系统对工厂画面中人员穿戴行为自动识别分析&#xff0c;发现现场人员未按照规定穿戴着装&#xff0c;立即抓拍告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c…

代码版本M、RC、GA、Release等标识的区别

引言 最近听说spring framework有了重大版本调整&#xff0c;出了6.0的GA版本了 那GA是啥意思呢&#xff1f; 看了下spring 官网和代码仓库&#xff0c;除了GA&#xff0c;还有M、RC、Release等 Spring FrameworkLevel up your Java code and explore what Spring can do f…

PCL源码剖析 -- 欧式聚类

PCL源码剖析 – 欧式聚类 参考&#xff1a; 1. pcl Euclidean Cluster Extraction教程 2. 欧式聚类分析 3. pcl-api源码 4. 点云欧式聚类 5. 本文完整工程地址 可视化结果 一. 理论 聚类方法需要将无组织的点云模型P划分为更小的部分&#xff0c;以便显著减少P的总体处理时间…

【hello Linux】Linux下 gitee 的使用

目录 1. 安装 git 2. gitee 的使用 2.1 注册 gitee 账号 2.2 创建项目&#xff1a;也就是仓库 2.3 下载项目到本地 3. 上传gitee三步走 3.1 三板斧第一招&#xff1a;git add 3.2 三板斧第二招&#xff1a;git commit 3.3 三板斧第三招&#xff1a;git push Linux&#x1f337…

海外虚拟主机空间:如何使用CDN加速提升用户体验?

随着互联网的迅速发展和全球化的趋势&#xff0c;越来越多的企业和个人选择海外虚拟主机空间。然而&#xff0c;由于服务器的地理位置和网络延迟等原因&#xff0c;这些网站在国内访问时可能会遇到较慢的加载速度和不稳定的用户体验。为了解决这一问题&#xff0c;使用CDN加速是…

【Linux】进程理解与学习Ⅳ-进程地址空间

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…

[JavaEE]----Spring01

文章目录Spring_day011&#xff0c;课程介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…

VN5620以太网测试——环境搭建篇

文章目录 前言一、新建以太网工程二、Port Configuration三、Link up四 Trace界面五、添加Ethernet Packet Builder六、添加ARP Packet七、添加Ethernet IG总结前言 CANoe(CAN open environment)VN5620 :是一个紧凑而强大的接口,用于以太网网络的分析、仿真、测试和验证。 …

面试篇-深入理解 Java 中的 HashMap 实现原理

一、HashMap实现原理 HashMap 的实现主要包括两个部分&#xff1a;哈希函数和解决哈希冲突的方法。 1.哈希函数 当使用 put() 方法将键值对存储在 HashMap 中时&#xff0c;首先需要计算键的哈希值。HashMap 使用 hashCode() 方法获取键的哈希值&#xff0c;并将其转换为桶&…

2023-04-11 无向图的匹配问题

无向图的匹配问题 之所以把无向图的这个匹配问题放到最后讲是因为匹配问题借鉴了有向图中一些算法的思想 1 最大匹配和完美匹配 二分图回顾 二分图&#xff1a;把一个图中的所有顶点分成两部分&#xff0c;如果每条边的两端分别属于不同部分&#xff0c;则这个图是二分图。更多…