ASP.NET MVC学习---(六)CRUD例子补充
在之前,我们使用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的招牌菜之一~
敬请期待~
ASP.NET MVC学习---(六)CRUD例子补充的更多相关文章
- ASP.NET MVC学习之模型验证详解
ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- ASP.NET MVC学习之Ajax(完结)
一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...
- ASP.NET MVC学习之过滤器篇(2)
下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
- (转)ASP.NET MVC 学习第一天
天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅 | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习as ...
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
- Asp.Net MVC学习总结之过滤器详解(转载)
来源:http://www.php.cn/csharp-article-359736.html 一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
随机推荐
- [poj] 3057 Evacuation
原题 题目大意 墙壁"X",空区域(都是人)".", 门"D". 人向门移动通过时视为逃脱,门每秒能出去一个人,人可以上下左右移动,墙阻止移 ...
- 命令__shell数字-字符串比较
shell常用逻辑判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若 ...
- linux进程——后台运行的方法
linux进程后台运行的几种方法: 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败. 如何让命 ...
- struts2之文件上传
一.单文件上传 实例: 表单应该注意三个点 form中的method="post".enctype="multipart/form-data".input中 ...
- 华中农业大学第四届程序设计大赛网络同步赛 J
Problem J: Arithmetic Sequence Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1766 Solved: 299[Subm ...
- java 复习整理(一 java简介和基础语法)
现在公司用的是封装太多东西的平台开发,觉着之前学的东西很多都忘了,所以想好好总结回顾一下.之前总是想学很多编程语言像python.s6.node.react,但现在越来越体会到编程语言只是一个开发的工 ...
- js,将日期时分秒等格式化和转化
1.将js Date对象格式化为指定格式,添加一个原型方法 /** * 返回指定format的string * format eg:'yyyy-MM-dd hh:mm:ss' **/ Date.pro ...
- ListView控件的不为人知的秘密
使用ListView控件展示数据 1.图像列表控件(ImageList控件) 图像列表控件(ImageList控件)是含有图像对象的集合,可以通过索引或关键字引用该集合的每个对象,ImageList控 ...
- UVA 10652 Board Wrapping(二维凸包)
传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...
- 过河(DP)
原题传送门 这道题要用到压缩的思想(原来DP还能这么用...) 其实很简单,假如我们要到某一个位置w 如果我们原位置为Q 很显然,如果(W-Q>=s*t)那么我们一定能到达W 换言之,就是如果我 ...