在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在之前,我们使用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的招牌菜之一~ 敬请期待~ |
请发表评论