1月13日—MVC基础知识整理

131 阅读4分钟

ASP.NET MVC框架,这里以MVC5为例,涉及到的知识有:Model-View-Controller的使用、Area和Global的理解、路由配置、数据传递的方式、AOP思想的体现(4大过滤器),各种Result、Razor语法、HttpContext相关的五大对象、分布视图、特性的补充、Html扩展控件、Bundles压缩js和css的原理、Owin约束、管道模型及MVC的工作原理。

ActionResult子类演示

1ViewResult() -->action方法中要想返回视图,则要使用ViewResult (MVC开发中用的最多)

2ContentResult() -->返回内容之用(特点,可以不需要有对应的视图) Home/ContentResultDemo中有示例

3、JsonResult() -->HomeController 的JsonDemo() 可以用作ajax请求 ,注意:如果是get请求,则一定是要在Json()中写入:JsonRequestBehavior.AllowGet

4、FileResult() -->HomeController 的FileResultDemo() 可以用作画验证码,也可以利用它来实现文件的下载

5、HttpStatusCodeResult() --》用户自己设置需要响应的状态码

6、JavaScriptResult 注意:JavaScript配合视图中的<script rc="">

7RedirectResult():执行页面跳转本质上是在响应报文头中产生了 Location:要跳转的页面的虚拟路径 命令

8、RedirectToRouteResult :当系统中路由规则比较多的时候,可以由程序员指定使用哪个路由规则来生成url

_ViewStart.cshtml:

View根目录下的_ViewStart.cshtml 先执行 然后再执行对应文件夹下的_ViewStart.cshtml 最后执行访问的cshtml页面

.NET里面webform的后缀是aspx WCF和WebService的后缀是asmx 一般处理程序后缀是ashx

字符串前面加@ 阻止字符串转义 "MV\tC" 输出 "MV C" @"MV\tC" 输出 "MV\tC"

MVC布局页:

@RenderBody() 占位符 将来会被使用此布局的子页面内容覆盖掉 只能在layout中出现一次

@Style.Render(); @Script.Render(); 获取Bundle中的样式和js文件 根据虚拟路径找到该虚拟路径下注册好的所有物理文件响应给浏览器 使用原因:减少http请求 自动压缩js和css的大小 方便程序员调用

分部视图:

分部视图是什么? 类似于asp.net webform(aspx)中的自定义控件.ascx

作用:可以将相同的逻辑块写到分部视图中,供其他视图来使用

引用:

@Html.RenderAction(PartialView,controller )

@RenderSection(“script”,required:false) 表示script可以在子类中重写 也就是说有此占位符才可以在子类写js。RenderSection 所定义的标签,可以被子页面重写,如果required设置成true,则必须子页面重写,如果是false可以不重写也可以重写

在cshtml视图上,如果将视图变成一个List的强类型视图,那么在使用@Html.DisplayNameFor(a=>a.GroupId)会报错,这是因为Razor视图经过编译发现List是一个具体的class所以a就推断成List,可以通过将List改成IEnumerable来解决

html控件:

@Html.ActionLink("跳转","About","Home",new { word ="a"},new { @class="aa",@id="abc"})

相当于:<aclass="aa" href="/Home/About?word=a" id="abc">跳转

MVC路由

/路由支持默认值 如下的Api

        routes.MapRoute(

            name: "Default",

            url: "Api/{controller}/{action}/{id}",

            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

            //通过正则确定参数的类型

            ,constraints:new {id="\\d+"},

            //定义了此路由的命名空间

            namespaces: new string[] { "MVCRoute.Controllers" }

            //好处:

            //1、可以自动去MVC站点的bin目录查找指定命名空间下的控制器类,大大节省了查        找时间,效率更优

            //2、方便同一个路由规则在不同控制器之间的切换

       //忽略路由

       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       //忽略某一种拓展资源或拓展名

       routes.IgnoreRoute("{resource}.do/{*pathInfo}");

//MVC中有2种视图引擎 一种是aspx 另一种是Razor 并且排序为 1.aspx视图引擎 2.Razor视图引擎 使用此方法可以把aspx的搜索引擎屏蔽掉 提高搜索效率

在MVC项目下的Global文件中加入:

      ViewEngines.Engines.RemoveAt(0);

在继承当中 子类既有父类的一些方法和属性又有自身的方法或属性,使用 base和this区分使用的方法或属性是自身的还是父类的

访问修饰符:public:公开访问 可被所有成员访问

         internal:程序集内部访问  只可以被程序集内部访问

       private:私有成员 只允许本类中的成员访问

protected :继承访问 允许本类及子类访问

((ViewResult)filterContext.Result).ViewBag.LoginName = user.LoginName; 在拦截器中创建viewbag 一般在AOP中使用


生成随机数 1Membership.GeneratePassword(20, 1)  2) Guid()  
3) 
public static void Random()
{
int t = 0;
for (int i = 0; i < 10; i++)
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
t = BitConverter.ToInt32(bytes, 0);
Random rnd = new Random(t);
Console.WriteLine(rnd.Next(0, 10));
}
}
4)
for (int i = 0; i < 10; i++)
{
    RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
    byte[] byteCsp = new byte[10];
    csp.GetBytes(byteCsp);
    Console.WriteLine(BitConverter.ToString(byteCsp));
}

//但是RNGCryptoServiceProvider的计算较为繁琐,在循环中使用会消耗造成大量的系统资源开销,使用时需注意. html特殊字符编码转成特殊字符

HttpUtility.HtmlDecode(text); HttpUtility.HtmlEncode(text);

过滤器仅对MVC是授权的 这也意味着 html页 webform页面 并不会被过滤器验证 webform可以使用web.config文件中的anthorization元素确保它们的安全

Authorize(Roles="Administrator,SuperAdmin",Users="Jon,Phil,Brad") Authorize可以指定多个角色和用户

服务器分为:web服务器 缓存服务器 数据库服务器 文件服务器 反向代理服务器 应用服务器

四大过滤器(图是网上偷的):

image.png

判断数据是否存在用Any(lambda) 速度快