zoukankan      html  css  js  c++  java
  • c# MVC5(一) 初步认识以及新建mvc

    一:MVC5初始

    1:广义MVC(Model--View-Controller):

    V是界面 ;

    M是数据和逻辑 ;

    C是控制,把M和V链接起来;

    是程序设计模式,一种设计理念,可以有效的分离界面和业务

    2:狭义MVC,是web开发框架

    V--Views 用户看到的视图内容
    C---Controllers 决定用户使用哪个视图Action,还能调用逻辑计算
    M--Models 数据传递模型,普通的实体

    二:visual   Studio种新建MVC

    1:右键新建项目

    2:选择web中的Asp.net web应用程序

    3:这个时候你可以选择空的mvc,但是一定要勾mvc,此时会生成一个空的mvc;此外你也可以选择mvc项目,这个下面的复选框或默认勾选上,这个会生成一个初始化的mvc项目,一些controll和view等都会默认生成,是直接可以预览的。具体你选择哪种方式可以依据自己的爱好而定。

    或者如下:

    此时mvc项目已经创建成功了,新建的mvc项目结构如下:

    三:MVC项目预览

    新创建的mvc项目会有一个默认配置,即浏览的时候:只需要controller的名字+view的名字即可,如下图:

    浏览的时候只需要:http://localhost:59596/Home/About 这样即能访问。

    1:为什么有这样的规则,这是取决于默认路由的,即为: 

    打开这个源码我们能看到有一个默认配置:

    这里面如果都不输入则会默认走:Home/Index这个页面

    2:如果我们项目中有需要配置url的地址,是不是只需要在这里修改,答案是正确的。我们举几个例子:

     1  public class RouteConfig
     2     {
     3         public static void RegisterRoutes(RouteCollection routes)
     4         {
     5             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     6             //忽略路由  正则表达式  {resource}表示变量   a.axd/xxxx   resource=a   pathInfo=xxxx
     7             //.axd是历史原因,最开始都是webform,请求都是.aspx后缀,IIS根据后缀转发请求;MVC出现了,没有后缀,IIS6以及更早版本,打了个补丁,把mvc的请求加上个.axd的后缀,然后这种都转发到网站----新版本的IIS已经不需要了,遇到了就直接忽略,还是走原始流程
     8             routes.IgnoreRoute("CustomService/{*pathInfo}");//以CustomService开头,都不走路由
     9 
    10             routes.MapRoute(
    11                 name: "About",
    12                 url: "About",
    13                 defaults: new { controller = "Home", action = "About", id = UrlParameter.Optional }
    14                 );//固定路由,/Home/About----About
    15 
    16             routes.MapRoute(
    17                name: "Test",
    18                url: "Test/{action}/{id}",
    19                defaults: new { controller = "Second", action = "Index", id = UrlParameter.Optional }
    20                );//修改控制器,如果以Test开头的,则一定指的是Second控制器
    21 
    22             routes.MapRoute(
    23               name: "Regex",
    24               url: "{controller}/{action}_{year}_{month}_{day}",
    25               defaults: new { controller = "Second", action = "Index", id = UrlParameter.Optional },
    26               constraints: new { year = @"d{4}", month = @"d{2}", day = @"d{2}" }
    27               ); //正则匹配,默认控制器是Second,action是Index;year,month,day必须按照一定的正则方式去匹配,如果匹配不上,则直接找不到!
    28           
    29             //常规路由,一般来说,我们不怎么扩展这个路由
    30             routes.MapRoute(
    31                 name: "Default",//路由名称,RouteCollection是key-value,key 避免重复
    32                 url: "{controller}/{action}/{id}",//正则规则:两个斜线 3个变量
    33                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    34             );
    35 
    36         }
    37     }
    View Code

    注意:路由是按照注册顺序进行匹配,遇到第一个吻合的就结束匹配;每个请求只会被一个路由匹配上

    四:controller与view之间传值,目前通用的有四种方式 

     1  private List<CurrentUser> _UserList = new List<CurrentUser>()
     2  {
     3      new CurrentUser()
     4      {
     5          Id=1,
     6          Name="青青",
     7          Account="Administrator",
     8          Email="331803047@qq.com",
     9          LoginTime=DateTime.Now,
    10          Password="123456"
    11      },
    12      new CurrentUser()
    13      {
    14          Id=2,
    15          Name="琪琪",
    16          Account="Administrator",
    17          Email="331803047@qq.com",
    18          LoginTime=DateTime.Now,
    19          Password="123456"
    20      },
    21      new CurrentUser()
    22      {
    23          Id=3,
    24          Name="可可",
    25          Account="Administrator",
    26          Email="331803047@qq.com",
    27          LoginTime=DateTime.Now,
    28          Password="123456"
    29      },
    30  };
    31 
    32  // GET: First
    33  /// <summary>
    34  ///  测试ViewData,ViewBag,TempData,model传值
    35  /// </summary>
    36  /// <param name="id"></param>
    37  /// <returns></returns>
    38  public ActionResult Index(int id = 3)
    39         {
    40             CurrentUser currentUser = this._UserList.FirstOrDefault(u => u.Id == id)
    41                 ?? this._UserList[0];
    42             
    43             base.ViewData["CurrentUserViewData"] = this._UserList[0];
    44             base.ViewBag.CurrentUserViewBag = this._UserList[1];
    45 
    46             base.ViewData["TestProp"] = "cx";
    47             base.ViewBag.TestProp = "Tenk";
    48             base.TempData["TestProp"] = "Spider";//独立存储
    49 
    50             base.TempData["CurrentUserTempData"] = currentUser;
    51 
    52             if (id == 1 || id == 2 || id == 3)
    53             {
    54                 return View(this._UserList[2]); //model传值,主要适合复杂数据的传递,强类型
    55             }
    56             else if (id < 10)
    57             {
    58                 //同Action传值
    59                 return View("~/Views/First/Index2.cshtml");
    60             }
    61             else
    62             {
    63                 //跨Action
    64                 return base.RedirectToAction("TempDataShow");
    65             }
    66         }
    67  public ActionResult TempDataShow()
    68  {
    69      return View();
    70  }
    View Code

    1:使用viewBag

    查看定义后发现:这是个动态类型,可以传任何值,如:

    然后页面直接调用:

     因为是动态类型,所以使用的时候不需要强制转换,直接可以拿来使用,

    2:使用viewData

    查看定义这个是个字典类型,是通过键值对来传的,比如:

    使用的时候,需要强制转换一下:

    3:使用TempData

    这个也是字典类型,是通过键值对来传递数据,但是通过点击会弹出:从一个请求保持到下一个请求的数据集,这就是跟viewBag和viewData的不同之处,这个是可以跨Action来传递的,即是不同的Action可以通过这个来传递,但是仅仅能使用一次,用完就会清除掉。

    定义的同viewData:

    使用的时候也需要强制转换一下:

    4:model

    因为view是继承于ViewResultBase的,所以可以通过Model来传至

    Controller传值只需要在view中传递值即可,如:

    前端接收是使用Model来接收的如下:

    以上是四种传值方式,不过最通用的就是Model来传,如果想要一次性传到页面多个属性,可以使用一个新的类把所有的属性集成起来一起传。

    注意:

    1:viewData跟ViewBag如果是相同的属性,则会覆盖,以最后一个为主。

    2:TempData--临时数据,可以跨action后台传递,存在session里面,用一次就清理掉

    五:局部页就是webForm中用户页ascx页面。

    1:创建局部页

    右键添加视图即可如下:

    这个出来的就是一个空的页面,也没有所谓的layout等,你可以在里面添加任何的代码。

    2:页面上面如何使用局部页,有四种方式:

     注意:

    1:@Html.Partial与@{Htmt.RenderPartial()}

    @Html.Partial用于将分部视图渲染为字符串

    @{Html.RenderPartial}将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void) 

    RenderPartial因为是直接写在响应流中,所以性能会更好(微量影响),而Partial不用写在代码块中,所以更方便

    2:RenderPartial和RenderAction两者的相同点

    通常都被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条。 两者输出的结果都被作为调用的View的一部分显示。

    两者的不同点

    1. RenderPatial的数据来自于调用的View,而RenderAction来自自己。
    2. RenderAction会发起一个新的Request,而RenderPatial不会。

     六:MVC的模板页

    1:有时候我们需要我们项目的整体页面都保持统一的头部尾部格式,webForm中我们会使用mastpage,在mvc中我们要创建的是layout或者名字自己定义,具体创建跟view一样,只是模板页面会多一些属性,下面我只是截图来说明几个Razor的语法。

    这个是新建mvc自带的,我们以这个为例来说明:

    @Styles.Render("~/Content/css") 使用样式包
    @Scripts.Render("~/bundles/modernizr") 使用js包
    @RenderBody() 就是页面的结合点,以后所有的页面内容会全部放在这里
    @RenderSection("scripts", required: false) :这个类似于一个占位符,其它页面可以使用@section scripts{<script>$(function () {})</script>},即里面写的js显示源码的时候会写到该指定的位置。

    2:创建view使用模版页面,只需要在头部引用一下即可,如:

  • 相关阅读:
    迁移学习——使用Tensorflow和VGG16预训模型进行预测
    AWK调用SHELL,并将变量传递给SHELL
    天津Uber优步司机奖励政策(1月18日~1月24日)
    南京Uber优步司机奖励政策(1月18日~1月24日)
    宁波Uber优步司机奖励政策(1月18日~1月24日)
    杭州(含嘉兴,绍兴,金华,湖州,义乌)Uber优步司机奖励政策(1月18日~1月24日)
    佛山Uber优步司机奖励政策(1月18日~1月24日)
    长沙Uber优步司机奖励政策(1月18日~1月24日)
    广州Uber优步司机奖励政策(1月18日~1月24日)
    西安Uber优步司机奖励政策(1月18日~1月24日)
  • 原文地址:https://www.cnblogs.com/loverwangshan/p/11053257.html
Copyright © 2011-2022 走看看