作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/9407847
一、MVC的route执行规则配置
打开之前创建好的mvc项目,在根目录找到Global.asax文件,这里面定义了我们整个项目如何根据接收到的请求 跳转到对应的控制器,执行对应的方法的规则。
如下:
public static void RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name 顾名思义,可以定义多个route规则,用name区分
//这里的url会根据参数跳转到对应的controller,访问对应的action方法,然后访问的页面,按照约定应该是在Views下面的{controller}下的{action}文件显示。
//最开始感觉这个id没什么用 并且后面随便输入任意字符后可以访问action,后来发现这里可以根据具体的参数返回不同的视图
//这里就和javaee的mvc不一样了,如果要做成一样也不是不可以,只不过核心控制器那里的逻辑判断要发生改变了
"{controller}/{action}/{id}", // URL with parameters
//如果没有指定具体的url,比如http://localhost:1950 那么将进入home的控制器,处理index的请求
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
//在程序启动的时候注册我们前面定义的route规则
RegisterRoutes(RouteTable.Routes);
}
其实,这里可以把它当成是javaee里面的核心控制器,所有的请求都要经过这个Routing 规则 指定 接下来怎么走。
二、创建MVC的Controller控制器
根据上面的配置,在浏览器输入:http://localhost:1950 ,那就默认调用Home控制器下(实际的controller是HomeController 统一约定去掉Controller这个后缀)的,Index 动作方法。
接下来看一下HomeController:
public class HomeController : Controller
{
//Home控制器,根据请求的url跳转到对应的action中,执行方法,
//比如:/Home/Index Home表示HomeController控制器,Index表示执行的方法。
//另外方法执行完毕之后return View() ,默认表示返回Views/Home/Index.cshtml,aspx等等一系列后缀的文件。
//如果加了参数,表示调用指定字符串的文件,并且参数不区分大小写,也就是说写index一样可以实现。如果不加参数,表示调用以Index action动作为名字的view
//这里默认是get请求方式,加上[httpGet]更加明显。
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View("Index");
}
public ActionResult About()
{
return View();
}
public ActionResult NoView()
{
return View();
}
}
在Index()方法中看到ViewBag 这个类,鼠标悬浮看到的注释是dynamic ControllerBase.ViewBag ,即 动态控制器包里面的一个试图包,通过它可以自定义任何类型的变量,然后在view中取出来,这里定义变量名是Message
三、创建MVC的View视图
前台View中的Index页面可以看到:<h2>@ViewBag.Message</h2>这样取值,我们从后台取值都是通过@符号来取值的,同时这里的Message也是不区分大小写的。
在浏览器中中显示:
Welcome to ASP.NET MVC!
这样子传递参数给前台,省略了之前每次都要通过request session等内置作用域传递的麻烦方式。而且用起来非常方便,易于去维护。
这样子的话,一个mvc的简单实现算是实现了,但是如果在action方法中,没有找到对应的方法,怎么办呢?
我们试一下调用 NoView()这个方法,结果显示如下图:
由此可以看出,mvc控制器它执行完action方法之后,它最开始去Views下的Home去找 NoView.aspx文件,如果有就显示页面,反之去找Home下面的NoView.ascx页面,一直往下面去找,直到上面所有的页面都没有找到的时候就抛异常了。
四、MVC的布局方式
接下来 再说一下mvc的布局
在Views目录下的Shared中找到_Layout.cshtml ,这个可以看做是一个模板,在我们需要显示具体的页面的地方加上@RenderBody()就可以了,然后所有的页面默认都会套用该模板了,如下图:
<!--
这是一个整体布局的页面,在div id为main的地方控制显示页面,另外如果这个页面被当成模板来使用,将不能被导入,否则违背了套用模板的原则
-->
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
</head>
<body>
<div class="page">
<div id="header">
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
@Html.Partial("_LogOnPartial")
</div>
<div id="menucontainer">
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("User", "Index", "User")</li>
</ul>
</div>
</div>
<div id="main">
@RenderBody()
</div>
<div id="footer">
</div>
</div>
</body>
</html>
另外的,这个是默认的模板,如果不想用这个模板,可以在顶部手动修改模板文件,比如:
@{
ViewBag.Title = "Home Page";
Layout = "~/Views/Shared/_Layout.cshtml"; //默认路径,可以不用指定的
}
五、view视图层的cshtml页面的简单语法
其实 这和java或.net的<%%>小脚本基本一样,只不过表示方式不一样罢了,MVC用的@{}这样子的语法。
@{这里面是小脚本}:
@* 这里面是多行注释*@
@变量名 直接输出自定义变量的值
等等 很多。
先来看一个简单的例子:
@{
//当行注释
@*
多行注释
*@
//声明变量 区分大小写
int id = 100;
var ID = 101;
string Name = "大写名称";
string name = "变量区分大小写";
}
<div>@id</div>
<div>@ID</div>
<div>@Name</div>
<div>@name</div>
<div>Hi@Name Hi @Name</div>
<!-- 从显示的结果可以看出 @{}里面定义的变量是区分大小写的,并且在取值的@前面不能有字符。 -->
<div>这里是字符串拼接开始@{@Name}E结束</div>
<div>for循环:
@{
for (int i = 0; i < 10; i++ )
{
@:@i @*在这里会输出i的值,和在html标签中使用@i是一样的*@
}
}
</div>
<div>
这里通过@可以声明特殊的字符串变量 输出双引号时,前面要多加一个双引号转义。
@{
var Password = @"""123456!@#$%^\""";
}
</div>
<div>
@Password
</div>
<div>
这里是转义输入@@ ,和java的\异曲同工:
@@
</div>
效果如下图:
六、服务器端的控件
接下来说下 服务器端的控件,这个和webform 里面不一样 ,不用每次需要一个控件就定义一个控件对象,在MVC视图的cshtml页面中直接使用@Html 后面加上控件的类别名称 以及参数就可以了。可以看一个例子来说明:
<div>服务器端TextBox: @Html.TextBox("txtUserName")</div>
<div>服务器端Password: @Html.Password("txtUserName")</div>
<div>服务器端Label: @Html.Label("txtUserName", "显示值")</div>
<div>服务端SelectedListItem
@{
//下拉列表的值
List<SelectListItem> selectList = new List<SelectListItem>();
selectList.Add(new SelectListItem { Value = "1", Text = "列表项一" });
selectList.Add(new SelectListItem { Value = "2", Text = "列表项二" });
}
@Html.DropDownList("ddlList", (SelectList)new SelectList(selectList.AsEnumerable(), "Value", "Text"))
</div>
<div>服务器端ReadioButton: @Html.RadioButton("rdo", "男")</div>
<div>服务器端CheckBox: @Html.CheckBox("chk")</div>
<div>服务器端链接: @Html.ActionLink("链接","Index")</div>
@*
导入页面,如果在layout为下面的路径,就是全局设置
并且一旦导入了,就不能作为 全局模板使用,即不能使用
*@
@Html.Partial("~/Views/Shared/Error.cshtml")
效果如下图:
ok,这样子 ,我们就可以完成一些简单的MVC功能的开发了。