ASP.NET MVC学习---(六)CRUD例子补充

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/38359191 在...
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/38359191

在之前,我们使用mvc做了一个crud的小例子

整个项目过程应该是能够很容易理解的

通过这个例子我们可以大概的了解mvc的基本使用方法

但是由于篇幅限制(还不如说自己懒不想写那么长...)

没有能够在上一篇的例子中涉及到比较详细的知识点

所有在这里做出补充

如果有遗漏或者不同理解的地方希望各位同学给出宝贵的意见~


1.action方法接收浏览器发送过来的参数的方式

可能有初学的同学看之前的代码时会感到一头雾水

在控制器类中的action方法参数中

怎么一会只要一个int id就可以

一会又要用什么实体对象来传递

到底什么时候用什么方式呢?

(1)根据路由配置来为action方法传递参数

例如上个例子中的路由规则是这样子的

url: "{controller}/{action}/{id}"

那么想要给action方法传递id参数(且必须明确是id参数)就可以直接写在url地址最后

action方法参数中只要有int id(这个id必须和路由配置里面的id是同名的)就可以自动接收到

可见,此方法用于传递类似id这样的参数很方便快捷,但是只能根据路由中配置好的规则来传递

(2)模型绑定

在crud的例子中我们已经提到过模型绑定

前台提交数据标签的name属性 和 后台实体类的属性名 一致

那么就可以在action方法中直接通过一个 实体类变量 来接收

mvc框架会自动前台提交的数据填充到这个实体参数中

这是个很爽很简便的参数传递方式

至于其中是怎么自动填充的

大概了解到是通过反射实现的

如果有兴趣,那是那句话,google之~

(3)通过Request键值对来接收参数

这种方式相信大家都很熟悉

在webform中经常使用

Request.Form或者Request.QueryString等

在mvc中同样可以使用

(4)通过FormCollection类接收参数

public ActionResult XXX(FormCollection form){...}

在action方法中通过一个FormCollection变量来接收参数

之后可以直接在代码中form["键"]来获得浏览器传递过来的数据

此方法的用法和第三种方法是一样的通过键值对来操作


2.action方法到底是什么?

可以说在控制器类中

我们见的最多,用的最多的就是action方法

之前我们说过,返回值为ActionResult的方法称之为action方法

那么这个ActionResult到底是各方神圣?

为什么我们既可以再action方法中返回视图也可以直接返回字符等数据呢?

我们用反编译工具来看看这个ActionResult到底是什么

在项目的bin文件夹下找到System.Web.Mvc.dll文件拖入Reflector中

展开程序集,找到System.Web.Mvc就会看到ActionResult

展开节点之后看看ActionResult的子类

现在是不是明白了一点什么?

我们在回头看看action方法中的return Redirect和View的返回值是什么

我们在ActionResult的子类是不是能看到RedirectResult和ViewResultBase的身影?

这就是为什么在action方法中可以返回各种各样的数据了

因为返回值都是ActionResult的子类

我们甚至可以将action方法的返回值确定到一个子类,如:

ViewResult

//通过数据上下文将T_Users的数据查询出来
        public ViewResult Index()
        {
            //将T_Users表的数据都取出来
            var users = dbEntities.T_Users.Where(u => true).ToList();
            //并交给ViewData.Model
            //ViewData.Model = users;

            //通过ViewBag传递数据给前台
            ViewBag.Users = users;
            return View();
        }
RedirectResult
//删除方法
        public RedirectResult Delete(int id)
        {
            T_Users user = new T_Users() {Id = id};
            dbEntities.T_Users.Attach(user);
            dbEntities.T_Users.Remove(user);
            dbEntities.SaveChanges();
            return Redirect("/Home/Index");
        }


3.返回视图的方式

当我们在action方法中使用return View()返回视图的时候有三种情况

(1)没有指定视图:只有return View(),这种情况mvc会默认加载本控制器文件夹下与action方法同名的视图

(2)指定本控制器下的另外一个视图:return View(”视图名“) mvc会加载本控制器文件夹下的该视图

(3)指定另外一个控制器文件夹下的视图:return View("~/xxx控制器文件夹/xxx.cshtml") 注意,使用这种方式要指定绝对路径,且要加上.cshtml后缀名


4.前后台传递参数的方式

(1)弱类型的ViewData

可以用键值对的形式为ViewData数据赋值或者取值

(2)动态型的ViewBag

动态添加属性传值

(3)Model

(4)TempData

该方式也是通过键值对来操作,使用方法和ViewData一样

到这里可能有有这样的疑问

为什么在后台的ViewData或者ViewBag中赋值之后可以在前台页面中得到呢?

我们知道后台的控制器是一个类

其实前台的cshtml也是一个类

但是他们之间的并不像是webform那样的继承关系

在mvc中,前后台类并没有直接的关系

前台类是后台的控制器类创建的

也就是说ViewData或者ViewBag赋值之后

在创建前台类时

会将ViewData或者ViewBag的值传给前台类

这其实就是一个数据传递而已

这里有一个点很有趣

当在后台使用ViewData["xxx"]=yyy时

在前台通过ViewBag.xxx也能渠道yyy的值

也就是说ViewData和ViewBag的值是共享的!

但是ViewData的Model属性(其实就是第三中方式的Model)是不和ViewBag共享的

而且注意,TempData中的数据也是不和其他属性共享的,TempData有着另外的作用,我们将会在以后进行讨论

相信很多人在使用ViewBag的时候肯定觉得很神奇

竟然可以想js代码一样随意点属性!

通过ViewBag转到定义可以看到

它其实是一个dynamic类型

这是一个动态的类型

dynamic obj=new Object();

主要是dynamic类型的变量,我们就可以随意的动手动脚~

它本质上其实就是一个Object类型,至于到底是怎么实现的,google在等你~



5.强类型视图

当我们用Model将实体对象传给前台时,最后效果是可以实现

但是在前台使用Model取值的时候是没有智能提示的

因为vs编译器并不确定Model是什么类型的数据

但是如果一定要这个效果呢?

@{
    Layout = null;
}
@*我们可以通过这种方式告诉编译器Model的类型,那么在后面的编码时就会出现智能提示*@
@model MvcTest.Models.T_Users
<!DOCTYPE html>
这就是所谓的强类型视图

提前为页面中的Model指定类型


通过上面补充的知识点希望能够加强对mvc的理解和印象~

下一遍Razor视图引擎语法

将会对Razor视图引擎进一步介绍

毕竟这可以mvc的招牌菜之一~

敬请期待~

相关文章
|
14天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
67 0
|
14天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
27 0
|
14天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
14天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
34 0
|
14天前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
6 0
|
14天前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
125 5
|
14天前
|
前端开发 数据库连接 数据库
ASP.NETMVC数据库完整CRUD操作示例
ASP.NETMVC数据库完整CRUD操作示例
38 0
|
14天前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
35 0
|
14天前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
128 0
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
127 0