MVC基础知识1

1.controller里返回file里的文件流stream不要using,mvc框架用完会自动dispose;using会关闭导致下载不了;

2.controller里用File类使需要写命名空间全称,不会回当做controller的方法;

3.return Json();默认禁止get请求,有安全风险;若要允许,Json(obj,JsonRequestBehavier.AllowGet);

4.TempData["key"]="";TempData依赖于session,取过一次之后就失效了,验证码用时很方便;

5.HttpContextBase是对HttpContext的封装,两者没有继承关系;代码中尽量用controller的HttpContext属性(HttpContextBase类型),利于单元测试。没法Current,随用随传;如果真要使用 HttpContext 类的话,就要   System.Web.HttpContext

6.ViewBag使dynamic类型的参数,是对ViewData动态类型的封装,用起来更方便,两者操作同一个数据;代码中尽量用model传数据;

7.今天在学习 mvc区域时,将区域控制器类 外迁到其他的程序集的练习中出现了"视图必须派生自 WebViewPage 或 WebViewPage<TModel>"错误,后来经过查找资料,发现是原来没      有将views文件夹下的web.config文件一起复制到区域文件夹下.

  Views 的 web.config 中的 system.web.webPages.razor 的 pages/namespaces 节点下配置 add命名空间,这样 cshtml 中就不用 using 了。如图:则不用再在cshtml中引用WebApplication2下的model了

 

8.dynamic与var:

  dynamic是c#提供的语法,可以实现像 JavaScript 一样的动态语言,可以到运行的时候再去发现属性的值或者调用方法。 好处是开发灵活,坏处是开发时发现错误,性能低;

9.Action 的三种类型的参数:普通参数、Model 类、FormCollection。

  FormCollection,采用 fc["name"]这种方法访问,类似于 HttpHandler 中用 ctx ["name"]。
  适用于表单元素不确定、动态的情况。

10.Action 的方法不能重载,Action 参数可以一部分普通参数,一部分 Model.

  Action 参数如果在请求中没有对应的值,则 Model 类的形式则取默认值:数字是 0、boolean是 false、引用类型是 null。如果是普通参数的形式:会报错,如果允许为空,要使用 int?。可以使用 C#的可选参数语法来设定默认值。         

11.上传文件的参数用 HttpPostedFileBase 类型,注意不是 HttpPostedFile 类型; 

12.return View("Action1")中如何传递 model?return View("Action1",model)。陷阱:如果 model传递的是 string 类型,则需要 return View("Action1",(object)str);这个函数有重载,不加object会匹配到别的函数。

13.文件  

1)FileContentResult File(byte[] fileContents, string contentType) 返回 byte[]格式的数据
2) FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName):
fileDownloadName 设定浏览器端弹出的保存建议的文件名。
3)FileStreamResult File(Stream fileStream, string contentType) 返回 Stream 类型的数据(框架
会帮着 Dispose,不用也不能 Dispose)
4)FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName)
5)FilePathResult File(string fileName, string contentType) 返回文件名指定的文件,内部还是
流方式读取文件;
6)FilePathResult File(string fileName, string contentType, string fileDownloadName)
如果是返回动态生成的图片(比如验证码),则不用设置 fileDownloadName;如果是“导
出学生名单”、“下载文档”等操作则要设定 fileDownloadName。
注意:如果在 Controller 中要使用 System.IO 下的 File 类,因为和 File 方法重名了,所以要用
命名空间来引用了。

14.JsonResult Json(object data) 把data对象序列化成json字符串返回给客户端,并且设置contentType为"application/json"。  

Json 方法默认是禁止 Get 请求的(主要为了防止 CSRF 攻击,举例:在 A 网站中嵌入一个请求
银行网站给其他账号转账的 Url 的 img),只能 Post 请求。所以如果以 Get 方式访问是会报错的。如
果确实需要以 Get 方式方式,需要调用 return Json(data, JsonRequestBehavior.AllowGet)

15.内置的JavaScripSerializer缺点:    

1) 日期类型的属性格式化成的字符串是"\/Date(1487305054403)\/"这样的格式,在客户端要用 js 代
码格式化处理,很麻烦。
2) json 字符串中属性的名字和 C#中的大小写一样,不符合 js 中“小写开头、驼峰命名”的习惯。
在 js 中也要用大写去处理。
3) 无法处理循环引用的问题(尽管应该避免循环引用),会报错“序列化类型为***的对象时检测
到循环引用”

 

16.LayOut

  @RenderBody()渲染正文部分;cshtml 的 Layout 属性设定 Layout 页面地址;(类似于模板页中定好头部,底部等,子页面填充中间内容)

 @RenderSection("Footer")用于渲染具体页面中用@section Footer{}包裹的内容;(类似于模板页中共有的部分某些现实子页面自由发挥填充)

  子页面可有可无那么使用@RenderSection("Footer",false)

  子页面定义与否的判断:用 IsSectionDefined("Footer")实现“如果没定义则显示***”的效果。

17.通过 Request.IsAjaxRequest()这个方法可以判断是否来自于 Ajax 请求,这样可以让 ajax 请求和非ajax 请求响应不同的内容。原理:Ajax 请求的报文头中有 x-requested-with: XMLHttpRequest。如果使用 System.Web.HttpContext,那么是没有这个方法的,那么自己就从报文头中取数据判断。

 

18.数据验证: ModelState.IsValid 

   asp.net mvc 会自动根据属性的类型进行基本的校验,比如如果属性是 int 类型的,那么在提交非整数类型的数据的时候就会报错

  注意 ASP.net MVC 并不是在请求验证失败的时候抛异常,而是把决定权交给程序员,程序员需要决定如何 处理数据校验失败。在Action 中根据 ModelState.IsValid 判断是否验证通过,如果没有通过下面的方法拿到报错信息:

 

   ASP.Net MVC 提供了在服务器端验证请求数据的能力。 要的 把对应的 Attribute 标记到Model 的属性 上 ( 标记到 方法 参数上很多地方不起作用

 

string errorMsg = WebMVCHelper.GetValidMsg(this.ModelState);
public  static  string  GetValidMsg(ModelStateDictionary  modelState)// 有 两 个
ModelStateDictionary  类,别弄混乱了 。要使用 System.Web.Mvc 下的
{
    StringBuilder sb = new StringBuilder();
    foreach(var key in modelState.Keys)
    {
        if(modelState[key].Errors.Count<=0)
        {
            continue;
        }
    sb.Append(" 属性【").Append(key).Append(" 】错误:");
    foreach (var modelError in modelState[key].Errors)
       {
            sb.AppendLine(modelError.ErrorMessage);
        }
    }
    return sb.ToString();
}                     

 

常用验证 Attribute :
a) [Required] 这个属性是必须的
b) [StringLength(100)] , 字符串度 最大长度 100 ;[StringLength(100,MinimumLength=10)]
长度要介于 10 到 到 100 之间
c) [RegularExpression(@"aa(\d)+bb")] 正则表达式
d) [Range(35,88)] 围 数 值 范 围 。 字 符 串 长 度 范 围 的 话 请 使 用
[StringLength(100,MinimumLength=10)]
e) [Compare("Email")] 这个属性必须和 Email 属性值一样。
f) [EmailAddress] 要是邮箱地址
g) [Phone] 电话号码,规则有限

19 编辑器加载中... 例如当前URI为:http://www.test.com/zzl/renren?id=1 获取绝对URI的路 System.Web.HttpContext.Current.Request.Url.AbsolutePath (/zzl/renren) 获取绝对URI System.Web.HttpContext.Current.Request.Url.AbsoluteUri (www.test.com/zzl/renren) 获取服务器的主机名或IP地址和端口号 System.Web.HttpContext.Current.Request.Url.Authority (www.test.com (127.0.0.1:88)) 获取实例的主机部分: System.Web.HttpContext.Current.Request.Url.Host (www.test.com) 获取当前URI的除主机头的乘下部分:Request.RawUrl (/zzl/renren?id=1) 得到当前URI的?号后面的部分(查询字符串) Request.QueryString (id=1) 得到当前URI在服务器上的原始路径 : Request.PhysicalPath(d:\project/b2cedu/web) 上次访问的URI:Request.UrlReferrer(进入www.test.com页面之前的那个页面的URI)

 

posted @ 2017-03-15 22:36  Lyfing  阅读(242)  评论(0编辑  收藏  举报