近日由于某些需求需要开发一个小网站,由于完成时间等没有限制,所以想要用之前不熟悉的技术开发。于是想到一直未曾动手的MVC,遂打算边学习,边开发,边分享,边思考。希望能达到几个小目标T_T
1. 练习文笔
2. 学习记录
3. 给新手提供些许帮助(毕竟本人也是参看别人的博客走过来的)
闲言少叙进入正题
用vs2015(或者其他版本)可以在几十秒内搭建一个完整的示例项目,如图:
上面的搭建过程很简单所以只发图不说话~~
MVC代表了模型-视图-控制器。
模型:模型类代表了应用程序中的数据,为强制执行业务规则使用了数据逻辑验证。
视图:应用程序中的视图模板文件用来动态生成HTML响应。
控制器:控制器类处理传入的浏览器请求,获取模型数据,然后指定视图模板,将响应返回给浏览器。
注意:
1. 示例项目中已经搭建好了一套目录结构,初期可直接参照使用(控制器建在控制器文件夹下)
2. 新建一个空控制器会默认生成一个控制器类且在视图文件夹下新建一个同名视图文件夹
建好了之后试试控制器,在控制器里添加如下代码:
// GET: /HelloWorld/
public string HelloWorld()
{
return "HelloWorld";
}
运行(ctrl+f5)项目依然会出示例项目,此时在地址后面加上你的控制器你的方法用/分隔试试
比如我的地址:http://localhost:5836
加上后变为:http://localhost:5836/HelloWorld/HelloWorld
方法里面 string值直接输出在页面上了~~
修改下代码
// GET: /HelloWorld/
public string HelloWorld()
{
return "这是一个div";
}
这是一个方法,如果我想接收参数怎么破?
写个带参数的方法
// GET: /HelloWorld/Welcome/
public string Welcome(string name, int id = 0)
{
return HttpUtility.HtmlEncode("name is" + name + ", id is: " + id);
}
不传参数
name没有值,id有初始值0
试试平时url传参的方式看他接收不
http://localhost:5836/HelloWorld/Welcome?name=liudao&id=1
可以接收~~有更简单的方式吗,查找下有的
http://localhost:5836/HelloWorld/Welcome/1
name没有值,id接收值变为1。
那么哪里约定了这样接收值呢
在App_Start/RouteConfig.cs里约定
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
从名字可以看出这是路由配置
url: “{controller}/{action}/{id}{name}”,控制器/方法名/参数名,根据上面的试验
http://localhost:5836/HelloWorld/Welcome/1 name无值,id接收到了值推测此参数名与方法中的参数名一致,试试,修改代码为
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{name}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
验证成功dangdang~
那么常规传参还可以吗?试试
地址栏中输入http://localhost:5836/HelloWorld/Welcome/1?name=name&id=2
猜猜结果是
1. name is: 1,id is 0//常规传值无法接收
2. name is: name,id is 2//快捷传值无法接收
3. name is: 1,id is 2//两者都可以,快捷传值优先级高
结果为3。
如果我想自己定义一个路由呢,试试:
修改代码如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{name}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "LiudaoRoute",
url: "{controller}/{action}/{name}/{id}"
);
}
地址栏输入http://localhost:5836/HelloWorld/Welcome/1/2
自己定义的完全没问题,再修改下,将我的路由设置移到默认的上方,是的我想试试优先级
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "LiudaoRoute",
url: "{controller}/{action}/{name}/{id}"
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}/{name}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
结果没变,通俗的解释就是:写在上面的代码优先级高。
好的,再写下去好像直接就去路由配置那里了,那控制器这一块先聊到这里,希望之后的内容再接再厉~
首先说一下,本来并没有这么大的热情写博客,之所以很想写,有很大一部分原因是因为csdn的markdown编辑器,实在是用的太爽。但这里不得不吐槽下,在编写的过程中,由于没有选择保存到线上草稿,所以当我无意间重新加载或者关闭网页的时候,我编写了很久的内容没了!!!其实常规的编辑器都是会有关闭提醒,当关闭网页的时候提示用户是否要关闭,或者更进一步在有内容未保存到线上草稿时,再有关闭提示,这样用户体验好很多。现在我不得不时不时的点一下:保存到线上草稿。。。