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的地址,是不是只需要在这里修改,答案是正确的。我们举几个例子:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//忽略路由 正则表达式 {resource}表示变量 a.axd/xxxx resource=a pathInfo=xxxx
//.axd是历史原因,最开始都是webform,请求都是.aspx后缀,IIS根据后缀转发请求;MVC出现了,没有后缀,IIS6以及更早版本,打了个补丁,把mvc的请求加上个.axd的后缀,然后这种都转发到网站----新版本的IIS已经不需要了,遇到了就直接忽略,还是走原始流程
routes.IgnoreRoute("CustomService/{*pathInfo}");//以CustomService开头,都不走路由 routes.MapRoute(
name: "About",
url: "About",
defaults: new { controller = "Home", action = "About", id = UrlParameter.Optional }
);//固定路由,/Home/About----About routes.MapRoute(
name: "Test",
url: "Test/{action}/{id}",
defaults: new { controller = "Second", action = "Index", id = UrlParameter.Optional }
);//修改控制器,如果以Test开头的,则一定指的是Second控制器 routes.MapRoute(
name: "Regex",
url: "{controller}/{action}_{year}_{month}_{day}",
defaults: new { controller = "Second", action = "Index", id = UrlParameter.Optional },
constraints: new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}" }
); //正则匹配,默认控制器是Second,action是Index;year,month,day必须按照一定的正则方式去匹配,如果匹配不上,则直接找不到! //常规路由,一般来说,我们不怎么扩展这个路由
routes.MapRoute(
name: "Default",//路由名称,RouteCollection是key-value,key 避免重复
url: "{controller}/{action}/{id}",//正则规则:两个斜线 3个变量
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
); }
}
注意:路由是按照注册顺序进行匹配,遇到第一个吻合的就结束匹配;每个请求只会被一个路由匹配上
四:controller与view之间传值,目前通用的有四种方式
private List<CurrentUser> _UserList = new List<CurrentUser>()
{
new CurrentUser()
{
Id=,
Name="青青",
Account="Administrator",
Email="331803047@qq.com",
LoginTime=DateTime.Now,
Password=""
},
new CurrentUser()
{
Id=,
Name="琪琪",
Account="Administrator",
Email="331803047@qq.com",
LoginTime=DateTime.Now,
Password=""
},
new CurrentUser()
{
Id=,
Name="可可",
Account="Administrator",
Email="331803047@qq.com",
LoginTime=DateTime.Now,
Password=""
},
}; // GET: First
/// <summary>
/// 测试ViewData,ViewBag,TempData,model传值
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ActionResult Index(int id = )
{
CurrentUser currentUser = this._UserList.FirstOrDefault(u => u.Id == id)
?? this._UserList[]; base.ViewData["CurrentUserViewData"] = this._UserList[];
base.ViewBag.CurrentUserViewBag = this._UserList[]; base.ViewData["TestProp"] = "cx";
base.ViewBag.TestProp = "Tenk";
base.TempData["TestProp"] = "Spider";//独立存储 base.TempData["CurrentUserTempData"] = currentUser; if (id == || id == || id == )
{
return View(this._UserList[]); //model传值,主要适合复杂数据的传递,强类型
}
else if (id < )
{
//同Action传值
return View("~/Views/First/Index2.cshtml");
}
else
{
//跨Action
return base.RedirectToAction("TempDataShow");
}
}
public ActionResult TempDataShow()
{
return View();
}
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的一部分显示。
两者的不同点
- RenderPatial的数据来自于调用的View,而RenderAction来自自己。
- 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使用模版页面,只需要在头部引用一下即可,如:
c# MVC5(一) 初步认识以及新建mvc的更多相关文章
- .NET MVC 学习笔记(一)— 新建MVC工程
一..NET MVC 学习笔记(一)—— 新建MVC工程 接触MVC有段时间了,一直想找机会整理一下,可是限于文笔太差,所以一直迟迟羞于下手,想到最近做过的MVC项目也有一些了,花点时间整理一下方便以 ...
- Visual Studio 2015 新建MVC项目 Package Manager Console不能使用 (HRESULT: 0x80131500)
Visual studio 2015 突然新建不了MVC项目,报出错误: HRESULT: 0x80131500 在折腾了很长时间,最后在Github上看到这样一个贴 地址:https://githu ...
- Mvc5+Entity Framework6 之二----在MVC中用Entity Framework实现基本的CRUD
目标:创建控制器和视图的代码,实现CRUD(创建,读取,更新,删除)功能 创建一个详细信息页 控制器为Students的Index页生成的代码排除Enrollments属性在外,因为该属性中关联着一个 ...
- ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合
建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...
- VS2017新建MVC+ORM中的LinqDb访问数据库项目
1.前提概述 ORM对象关系映射(Object-Relational Mapping)是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言 ...
- STS 新建mvc工程--helloworld
File--New--Spring Template Project 选择Spring MVC Project 填写项目名称和基础的包名 Finish之后就完成了. 把项目添加到服务器,然后运行.在浏 ...
- 手动新建MVC控制器和视图,以及数据显示的问题
一,在C#.NET的MVC项目添加一个控制器,在这个控制器有一个index方法,你可以在index方法上鼠标右键选择添加视图,这可以创建一个包含index.cshtml的View视图的文件夹 < ...
- Asp.Net MVC 之 Autofac 初步使用2 集成mvc 属性注入以及自动注入
首先看下Demo2的结构 然后下面一步步将Autofac集成到mvc中. 首先,定义Model Product.cs public class Product { public int Id ...
- Artech的MVC4框架学习——第一章初步认识ASP.NET MVC
前言: Artech觉得掌握ASP.NET MVC具有三个层次. 第一层了解基本的编程模式,掌握Controller和View的定义方式,知道路由如何注册以及验证规则如何定义. 第二个层次要求我们对A ...
随机推荐
- 【使用篇二】SpringBoot整合Filter(2)
两种方式: 通过注解扫描完成 Filter 组件的注册 通过方法完成 Filter 组件的注册 一.通过注解扫描完成 Filter 组件的注册 1. 编写Filter类 /** * SpringBoo ...
- vscode使用插件来添加文件说明和函数说明——42header——psioniq File Header——koroFileHeader
安装号以后,设置快捷键如下: 同时需要根据自己的需要的修改json文件 // 文件头部注释 "fileheader.customMade": { "Description ...
- <DFS & BFS> 130 127
130. Surrounded Regions BFS: 把所有边界上的O先换成A(标记),再深度遍历周围的点. 最后把O换成X(表示不符合要求),所有的A换回O class Solution { p ...
- ios、安卓的兼容性
日期转换成时间戳: 安卓下可以使用 Date.parse(new Date('2019-11-18 12:00:00')) 直接转换,结果为 1574049600000 ios下 Date.parse ...
- echarts的markline的使用 y轴预警线
代码示例: app.title = '坐标轴刻度与标签对齐'; option = { color: ['#3398DB'], tooltip : { trigger: 'axis', axisPoin ...
- CF1178F Short/Long Colorful Strip(DP)
说起来,这题好像也不难-- 先考虑 F1 怎么做. 既然别的方法都不行不如试试\(f_{i,j}\) 表示在刚刚准备开始涂 \([i,j]\) 中最小编号的颜色之前,整个区间是同色的,且最后能做到 \ ...
- MySQL实战45讲学习笔记:第十一讲
一.如何在邮箱这样的字段上建立合理的索引 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题. 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的 ...
- [LeetCode] 312. Burst Balloons 打气球游戏
Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...
- Oracle 10G RAC集群安装
一,基本环境配置 01,hosts cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loc ...
- python 利用淘宝IP库 查询IP归属地
#coding:utf-8 from django.test import TestCase import json import urllib ip = "114.114.114.114& ...